2017-04-21 1 views
0

Ich versuche, mit einigen fortgeschrittenen Ansible Playbooks loszulegen und habe eine Wand getroffen. Ich versuche Ansible zu erreichen, was diese/bin/bash 'for' Schleife macht;einen Shell-Befehl in Ansible looping

for i in $(</filename.txt);do '/some/command options=1 user=usera server=$i';done 

dateiname.txt enthält 50-100 Hostnamen.

Ich kann nicht jinja Vorlagen verwenden, da der Befehl ausgeführt werden muss, nicht nur die Konfigurationsdatei aktualisiert.

Jede Hilfe würde sehr geschätzt werden.

Vielen Dank im Voraus, Jeremy

Antwort

2
  1. Sie jinja Vorlagen verwenden können, aber anders
  2. Ihren spezifischen Code nicht, etwas zu tun, dass die meisten
  3. für mehrzeilige Code sollten Sie shell ratsam ist, verwenden Modul.

Beispiel für Multicode-Stück Anruf:

- name: run multiline stuff 
    shell: | 
    for x in "${envvar}"; do 
     echo "${x}" 
    done 
    args: 
    executable: /bin/bash 

note ich ausdrücklich executable habe die Einrichtung, die bash-isms funktionieren würde sicherstellen.

Ich habe gerade envvarals Beispiel, von beliebigen Umgebungsvariablen zur Verfügung.

, wenn Sie bestimmte env Variablen übergeben müssen, sollten Sie environment Klausel des Anrufs shell Modul Verwendung finden Sie unter: http://docs.ansible.com/ansible/playbooks_environment.html

Für einfache Variablen können Sie einfach ihren Wert in der Shell verwenden: echo "myvar: {{myvar}}"

Wenn Sie eine ansible List/Tuple-Variable innerhalb des Bash-Codes verwenden möchten, können Sie die bash-Variable zuerst setzen. z.B. Wenn Sie eine Liste von Dingen in mylist haben, können Sie sie erweitern und in ein Bash-Array zuweisen und dann darüber iterieren. der Shell-Code des Anrufs zu shell wäre:

mylist_for_bash=({{mylist|join(" ")}}) 
    for myitem in "${mylist_for_bash[@]}"; do 
     echo "my current item: ${myitem}" 
    done 

Ein anderer Ansatz, es zu passieren, wie String env Variable wäre, und es in eine umzuwandeln später im Code.

HINWEIS: natürlich all diese Werte korrekt nur mit raumlos arbeitet Ich habe nie Array übergeben mit Raum enthält Elemente

+0

@ jeremy-huey, für Best Practices, Verwenden Sie 'shellcheck', z schreibe deinen Scriptlet in eine Datei und führe folgendes aus: 'shellcheck myfile.sh' Dies wird verschiedene Warnungen ausgeben, was zu tun ist. https://github.com/koalaman/shellcheck –

+0

Also wäre '$ {envvar}' eine Liste im ../var Verzeichnis für die zutreffende Ansible Rolle? –

+0

@ JeremyHuey Ich habe es nur als Beispiel für einige Umgebungsvariablen verwendet.Wenn Sie bestimmte env-Variablen übergeben müssen, sollten Sie die 'environment'-Klausel des Aufrufs von' shell' verwenden, siehe: http://docs.ansible.com/ansible/playbooks_environment.html –