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

218

Je suis nouveau chez ansible et je me demande comment faire car les choses suivantes n'ont pas fonctionné

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

django_fixturesest ma variable.

Édouard Lopez
la source

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)

Édouard Lopez
la source
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') }}
GreensterRox
la source
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"
lanni654321
la source
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
OpenITeX
la source
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.

Ali Atakan
la source
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

Nitesh Jain
la source
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
la source
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') }}"

user164328
la source
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`
Rajeev Singh
la source