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


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.


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') }}

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"

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


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

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.


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


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}}"

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') }}"


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`
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.