Comment passer une variable à un playbook ansible dans la ligne de commande?


Réponses:


307

En lisant les documents, je trouve la section Passer des variables sur la ligne de commande , qui donne cet exemple:

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

D'autres exemples montrent comment charger à partir d'une chaîne JSON (≥ 1.2) ou d'un fichier (≥ 1.3)


33
Notez également que les variables définies avec --extra-varsremplaceront les variables définies dans le playbook.
somme de contrôle

5
Notez également (à partir des documents): les valeurs transmises à l'aide de la key=valuesyntaxe sont interprétées comme des chaînes . Utilisez le format JSON si vous devez transmettre tout ce qui ne devrait pas être une chaîne (booléens, entiers, flottants, listes, etc.). Par exemple:--extra-vars '{"i_wasted_30_mins_debugging_a_boolean_string":true}'
smilin_stan

159

D'autres réponses indiquent comment passer les variables de ligne de commande mais pas comment y accéder, donc si vous le faites:

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

Dans votre fichier yml, vous les affectez à des variables ansibles étendues en faisant quelque chose comme:

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

Une alternative à l'utilisation des arguments de ligne de commande est d'utiliser des variables d'environnement qui sont déjà définies dans votre session, vous pouvez les référencer dans vos fichiers yml ansible comme ceci:

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

29
Vous ne savez pas de quoi vous parlez ?? Ma réponse se développe sur les réponses précédemment acceptées en se référant à l'indicateur de ligne de commande --extra-vars ET comment les référencer dans votre configuration yaml. Ensuite, je propose également une autre manière de procéder.
GreensterRox

1
La question ici est spécifiquement de passer la variable via la ligne de commande . C'est exactement pourquoi il serait préférable que ce soit sa propre question / réponse et un lien connexe. Vous pouvez et le lien connexe en tant que commentaire de la question.
Édouard Lopez

43
La réponse élargie m'a aidé. Sûrement savoir comment référencer les variables passées en partie de savoir comment passer des paramètres. Sinon, vous ne les transmettez pas, mais vous déclarez simplement que vous souhaitez transmettre la variable. Passer un objet nécessite un donneur et un récepteur. Pour passer une variable, il faut une déclaration de paramètre et une utilisation du paramètre.
conteh

lookup('env', SOMETHING)correspond au facteur 12.
zx1986

1
N'oubliez pas de changer le nom de la variable: version: {{ version }}c'est faux, comme définir versionpar lui-même.
Minh Nghĩa

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

25
Le -edrapeau est la forme abrégée de--extra-vars
Édouard Lopez

4
Puis-je transmettre un fichier variable?
OpsEco

13
@AniruddhaJawanjal oui, comme--extra-vars "@some_file.json"
AlanSE

1
@OpsEco @AlanSE notez que si vous transmettez des variables à partir d'un fichier, vous avez besoin d'un deuxième --extra-varsindicateur pour transmettre des variables ne figurant pas dans le fichier. Par exemple--extra-vars "@some_file.json" --extra-vars "other_variable=foo"
bonh

Merci @bonh c'est ce que je cherchais
fan


31

Pour une raison quelconque, aucune des réponses ci-dessus n'a fonctionné pour moi. Comme j'ai besoin de passer plusieurs vars supplémentaires à mon playbook dans Ansbile 2.2.0, voici comment je l'ai fait fonctionner (notez l'option -e avant chaque var):

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

4
-eest la forme abrégée de--extra-vars
Édouard Lopez

@LXCdev KohaLappi +1 pour avoir démontré que vous pouvez spécifier des vars supplémentaires dans leur propre -edrapeau
ctlockey

Vous pouvez également définir plusieurs variables à l'aide d'un seul indicateur:-e "firstvar=false second_var=value2"
Nils Breunese

Même problème. Plusieurs vars avec un seul drapeau ne fonctionneraient pas. Je me demande pourquoi?
Bret

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

Dans le fichier yml, vous pouvez les utiliser comme ceci

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

De plus, --extra-varset -esont les mêmes, vous pouvez utiliser l'un d'eux.


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

ici, les variables sont utilisées comme «pathoftsfiles» et «dossier». Maintenant, la valeur de cette variable peut être donnée par la commande ci-dessous

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

Remarque: N'utilisez pas les virgules inversées lors du passage des valeurs à la variable dans la commande 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

Cela a également fonctionné pour moi si vous souhaitez utiliser des variables d'environnement 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"

Vous pouvez utiliser la commande ci-dessus dans les playbooks ci-dessous.

---
- 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`
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.