J'ai ceci play.yml
---
- hosts: 127.0.0.1
connection: local
Sudo: false
tasks:
- include: Apache.yml
Mon Apache ressemble à ceci:
vars:
url: czxcxz
- name: Download Apache
Shell: wget {{url}}
Cela me donne une erreur.
Si je supprime vars
, alors cela fonctionne. Mais je veux inclure les vars dans les tâches afin de pouvoir séparer les vars différents pour différentes tâches.
REMARQUE: Utilisation de set_fact
comme décrit ci-dessous définit un fait/variable sur les serveurs distants sur lesquels la tâche est exécutée. Ce fait/variable persistera ensuite dans les tâches suivantes pendant toute la durée de votre livre de jeu.
De plus, ces faits sont immuables (pour la durée du manuel) et ne peuvent pas être modifiés une fois définis.
Utilisation set_fact
_ avant votre tâche de définir faits qui semblent interchangeables avec des variables:
- name: Set Apache URL
set_fact:
Apache_url: 'http://example.com/Apache'
- name: Download Apache
Shell: wget {{ Apache_url }}
Voir http://docs.ansible.com/set_fact_module.html pour le mot officiel.
Je sais que cela fait longtemps, mais comme la réponse la plus simple n’a pas encore été publiée, je le ferai pour les autres utilisateurs qui pourraient suivre.
Il suffit de déplacer le var dans le bloc "name":
- name: Download Apache
vars:
url: czxcxz
Shell: wget {{url}}
Les définitions de variables sont destinées à être utilisées dans les tâches. Mais si vous souhaitez les inclure dans des tâches, utilisez probablement la directive register
. Comme ça:
- name: Define variable in task.
Shell: echo "http://www.my.url.com"
register: url
- name: Download Apache
Shell: wget {{ item }}
with_items: url.stdout
Vous pouvez également regarder rôles comme moyen de séparer les tâches en fonction des différents rôles rôles . De cette façon, vous pouvez avoir des variables séparées pour chacun de vos rôles. Par exemple, vous pouvez avoir une variable url
pour Apache1
et une variable séparée url
pour le rôle Apache2
.
Dans votre exemple, Apache.yml est une liste de tâches, mais pas un livre de lecture.
Dans dépend de l'architecture souhaitée, vous pouvez effectuer l'une des opérations suivantes:
Convertissez Apache.yml en rôle. Ensuite, définissez les tâches dans les rôles/Apache/tasks/mail.yml et les variables dans les rôles/Apache/default/mail.yml (les variables par défaut peuvent être remplacées lorsque le rôle est appliqué)
Définir vars dans le livre de jeu de play.yml
play.yml
---
- hosts: 127.0.0.1
connection: local
Sudo: false
vars:
url: czxcxz
tasks:
- include: Apache.yml
Apache.yml
- name: Download Apache
Shell: wget {{url}}
Chaque fois que vous avez un module suivi d'une variable sur la même ligne dans ansible, l'analyseur considère la variable de référence comme le début d'un dictionnaire en ligne. Par exemple:
- name: some example
command: {{ myapp }} -a foo
Le défaut ici est d’analyser la première partie de {{ myapp }} -a foo
comme un dictionnaire au lieu d’une chaîne et vous obtiendrez une erreur.
Donc, vous devez citer l'argument comme suit:
- name: some example
command: "{{ myapp }} -a foo"