web-dev-qa-db-fra.com

Comment puis-je écrire des variables dans le fichier de tâches dans ansible

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.

41
user1994660

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.


RÉPONSE ORIGINALE

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.

66
dodgio

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}} 
12
appleitung

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.

9
Rico

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:

  1. 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é)

  2. 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}} 
2
mmv-ru

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"
0
Dwayne Mcnab