Come posso passare una variabile a un playbook con risposta nella riga di comando?


Risposte:


307

Leggendo i documenti trovo la sezione Passaggio di variabili sulla riga di comando , che fornisce questo esempio:

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

Altri esempi dimostrano come caricare dalla stringa JSON (≥ 1.2) o dal file (≥ 1.3)


33
Nota anche che le variabili definite con --extra-varssostituiranno le variabili definite all'interno del playbook.
checksum

5
Nota anche (dai documenti): i valori passati usando la key=valuesintassi sono interpretati come stringhe . Utilizzare il formato JSON se è necessario passare qualcosa che non dovrebbe essere una stringa (booleani, numeri interi, float, elenchi ecc.). Ad esempio:--extra-vars '{"i_wasted_30_mins_debugging_a_boolean_string":true}'
smilin_stan,

159

Altre risposte indicano come passare le variabili della riga di comando ma non come accedervi, quindi se lo fai:

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

Nel tuo file yml li assegni a variabili rispondibili con ambito facendo qualcosa del tipo:

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

Un'alternativa all'utilizzo di args a riga di comando è quella di utilizzare variabili ambientali che sono già definite all'interno della sessione, è possibile fare riferimento a questi all'interno dei tuoi file yml ansible come questo:

vars:
    my_version: "{{ lookup('env', 'version') }}"
    my_other_variable: {{ lookup('env', 'other_variable') }}

29
Non sei sicuro di cosa stai parlando ?? La mia risposta si espande sulle risposte precedentemente accettate facendo riferimento al flag della riga di comando --extra-vars E come fare riferimento a loro all'interno della configurazione yaml. Quindi offro anche un modo alternativo di farlo.
GreensterRox,

1
La domanda qui è specificamente passare la variabile attraverso la riga di comando . Questo è esattamente il motivo per cui sarebbe meglio in quanto è la propria domanda / risposta e un collegamento correlato. È possibile e il collegamento correlato come un commento alla domanda.
Édouard Lopez,

43
La risposta estesa mi ha aiutato. Sicuramente sapere come fare riferimento alle variabili passate in parte del sapere come passare i parametri. Altrimenti non li passi ma piuttosto dichiari di voler passare la variabile. Per passare un oggetto sono necessari un donatore e un ricevitore. Per passare una variabile è necessaria una dichiarazione di parametro e un utilizzo del parametro.
conte

lookup('env', SOMETHING)corrisponde al fattore 12.
zx1986

1
Ricorda di cambiare il nome della variabile: version: {{ version }}è sbagliato, come definire versionda solo.
Minh Nghĩa,

41
ansible-playbook release.yml -e "version=1.23.45 other_variable=foo"

25
La -ebandiera è la forma abbreviata di--extra-vars
Édouard Lopez,

4
Posso passare un file variabile?
OpsEco,

13
@AniruddhaJawanjal sì, tipo--extra-vars "@some_file.json"
AlanSE

1
@OpsEco @AlanSE notare che se si passano variabili da un file, è necessario un secondo --extra-varsflag per passare le variabili non presenti nel file. Ad esempio--extra-vars "@some_file.json" --extra-vars "other_variable=foo"
bonh

Grazie @bonh era quello che stavo cercando
fan il


31

Per qualche motivo nessuna delle risposte sopra ha funzionato per me. Dato che ho bisogno di passare diversi parametri extra sul mio playbook in Ansbile 2.2.0, ecco come ho fatto funzionare (notare l'opzione -e prima di ogni var):

ansible-playbook site.yaml -i hostinv -e firstvar=false -e second_var=value2

4
-eè la forma abbreviata di--extra-vars
Édouard Lopez,

@LXCdev KohaLappi +1 per aver dimostrato che puoi specificare altri vars nella loro -ebandiera
ctlockey,

Puoi anche definire più variabili usando un singolo flag:-e "firstvar=false second_var=value2"
Nils Breunese

Stesso problema. Più var con una singola bandiera non funzionerebbero. Mi chiedo perché?
Bret,

14
ansible-playbook test.yml --extra-vars "arg1=${var1} arg2=${var2}"

Nel file yml puoi usarli in questo modo

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

Inoltre, --extra-varse -esono uguali, puoi usarne uno.


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

qui vengono utilizzate le variabili denominate 'pathoftsfiles' e 'folder'. Ora il valore di questa variabile può essere dato dal comando seguente

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

Nota: non utilizzare le virgolette durante il passaggio dei valori alla variabile nel comando shell


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

Questo ha funzionato anche per me se si desidera utilizzare le variabili di ambiente shell:

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"

Puoi usare il comando sopra nei playbook sottostanti.

---
- 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`
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.