Wie kann ich eine Variable in der Befehlszeile an ein ansible Playbook übergeben?

218

Ich bin neu in Ansible und frage mich, wie ich das machen soll, da das Folgende nicht funktioniert hat

ansible-playbook -i '10.0.0.1,' yada-yada.yml --tags 'loaddata' django_fixtures="tile_colors"

Wo django_fixturesist meine Variable?

Édouard Lopez
quelle

Antworten:

307

Beim Lesen der Dokumente finde ich den Abschnitt Übergeben von Variablen in der Befehlszeile , der dieses Beispiel enthält:

ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"

Andere Beispiele zeigen, wie aus einer JSON- Zeichenfolge (≥ 1.2) oder einer Datei (≥ 1.3) geladen wird.

Édouard Lopez
quelle
33
Beachten Sie auch, dass die mit definierten --extra-varsVariablen die im Playbook definierten Variablen überschreiben.
Prüfsumme
5
Beachten Sie auch (aus den Dokumenten): Mit der key=valueSyntax übergebene Werte werden als Zeichenfolgen interpretiert . Verwenden Sie das JSON-Format, wenn Sie etwas übergeben müssen, das keine Zeichenfolge sein sollte (Boolesche Werte, Ganzzahlen, Gleitkommazahlen, Listen usw.). Zum Beispiel:--extra-vars '{"i_wasted_30_mins_debugging_a_boolean_string":true}'
smilin_stan
159

Andere Antworten geben an, wie die Befehlszeilenvariablen übergeben werden, nicht jedoch, wie auf sie zugegriffen werden soll. Wenn Sie dies also tun:

--extra-vars "version=1.23.45 other_variable=foo"

In Ihrer yml-Datei weisen Sie diese Variablen mit Gültigkeitsbereich zu, indem Sie Folgendes tun:

vars:
    my_version: "{{ version }}"
    my_other_variable: {{ other_variable }}

Eine Alternative zur Verwendung von Befehlszeilenargumenten besteht darin, Umgebungsvariablen zu verwenden, die bereits in Ihrer Sitzung definiert sind. Sie können diese in Ihren ansible-yml-Dateien wie folgt referenzieren:

vars:
    my_version: "{{ lookup('env', 'version') }}"
    my_other_variable: {{ lookup('env', 'other_variable') }}
GreensterRox
quelle
29
Nicht sicher, wovon du sprichst? Meine Antwort erweitert zuvor akzeptierte Antworten, indem sie sich auf das Befehlszeilenflag --extra-vars bezieht UND wie Sie sie in Ihrer yaml-Konfiguration referenzieren. Dann biete ich auch eine alternative Möglichkeit an.
GreensterRox
1
Die Frage hier ist speziell, Variable über die Befehlszeile zu übergeben . Genau deshalb wäre es besser, wenn es sich um eine eigene Frage / Antwort und einen zugehörigen Link handelt. Sie können und den zugehörigen Link als Kommentar zur Frage.
Édouard Lopez
43
Die erweiterte Antwort hat mir geholfen. Sicherlich wissen, wie man auf die übergebenen Variablen verweist, teilweise wenn man weiß, wie man Parameter übergibt. Andernfalls übergeben Sie sie nicht, sondern erklären nur, dass Sie die Variable übergeben möchten. Um ein Objekt zu übergeben, sind ein Geber und ein Empfänger erforderlich. Das Übergeben einer Variablen erfordert eine Parameterdeklaration und die Verwendung des Parameters.
Conteh
lookup('env', SOMETHING)ist der 12 Faktor angepasst.
zx1986
1
Denken Sie daran, den Namen der Variablen zu ändern: version: {{ version }}ist falsch, wie das Definieren versionvon selbst.
Minh Nghĩa
41
ansible-playbook release.yml -e "version=1.23.45 other_variable=foo"
lanni654321
quelle
25
Die -eFlagge ist die Kurzform von--extra-vars
Édouard Lopez
4
Kann ich eine variable Datei übergeben?
OpsEco
13
@ AniruddhaJawanjal ja, wie--extra-vars "@some_file.json"
AlanSE
1
@OpsEco @AlanSE Beachten Sie, dass Sie beim Übergeben von Variablen aus einer Datei ein zweites --extra-varsFlag benötigen , um Variablen zu übergeben, die nicht in der Datei enthalten sind. Zum Beispiel--extra-vars "@some_file.json" --extra-vars "other_variable=foo"
Bonh
Danke @bonh das war was ich gesucht habe
Fan
33

Sie können die --extra-varsOption verwenden. Siehe die Dokumente

jarv
quelle
31

Aus irgendeinem Grund hat keine der oben genannten Antworten für mich funktioniert. Da ich in Ansbile 2.2.0 mehrere zusätzliche Vars an mein Playbook übergeben muss, habe ich es so zum Laufen gebracht (beachten Sie die Option -e vor jeder VAR):

ansible-playbook site.yaml -i hostinv -e firstvar=false -e second_var=value2
OpenITeX
quelle
4
-eist die Kurzform von--extra-vars
Édouard Lopez
@LXCdev KohaLappi +1 für die Demonstration, dass Sie zusätzliche vars in ihrer eigenen -eFlagge angeben können
ctlockey
Sie können auch mehrere Variablen mit einem einzigen Flag definieren:-e "firstvar=false second_var=value2"
Nils Breunese
Gleiches Problem. Mehrere Variablen mit einem einzigen Flag würden nicht funktionieren. Ich wundere mich warum?
Bret
14
ansible-playbook test.yml --extra-vars "arg1=${var1} arg2=${var2}"

In der yml-Datei können Sie sie so verwenden

---
arg1: "{{ var1 }}"
arg2: "{{ var2 }}"

Auch --extra-varsund -egleich sind, können Sie einen von ihnen verwenden.

Ali Atakan
quelle
4
 s3_sync:
      bucket: ansible-harshika
      file_root: "{{ pathoftsfiles  }}"
      validate_certs: false 
      mode: push
      key_prefix: "{{ folder }}"

Hier werden die Variablen mit den Namen 'pathoftsfiles' und 'folder' verwendet. Jetzt kann der Wert für diese Variable mit dem folgenden Befehl angegeben werden

sudo ansible-playbook multiadd.yml --extra-vars "pathoftsfiles=/opt/lampp/htdocs/video/uploads/tsfiles/$2 folder=nitesh"

Hinweis: Verwenden Sie keine Anführungszeichen, während Sie die Werte im Shell-Befehl an die Variable übergeben

Nitesh Jain
quelle
2
ansible-playbook release.yml --extra-vars "username=hello password=bye"

#you can now use the above command anywhere in the playbook as an example below:
tasks:
- name: Create a new user in Linux
shell: useradd -m -p {{username}} {{password}}"
Naveen Goyal
quelle
2

Dies hat auch bei mir funktioniert, wenn Sie Shell-Umgebungsvariablen verwenden möchten:

ansible-playbook -i "localhost," ldap.yaml --extra-vars="LDAP_HOST={{ lookup('env', 'LDAP_HOST') }} clustername=mycluster env=dev LDAP_USERNAME={{ lookup('env', 'LDAP_USERNAME') }} LDAP_PASSWORD={{ lookup('env', 'LDAP_PASSWORD') }}"

user164328
quelle
1

ansible-playbok -i <inventory> <playbook-name> -e "proc_name=sshd"

Sie können den obigen Befehl in den folgenden Playbooks verwenden.

---
- name: Service Status
gather_facts: False
tasks:
- name: Check Service Status (Linux)
shell: pgrep "{{ proc_name }}"
register: service_status
ignore_errors: yes
debug: var=service_status.rc`
Rajeev Singh
quelle