variable globale exécutable ansible

8

Je veux créer un cluster de serveurs, en utilisant ansible.

Dans un playbook principal, j'inclus quelques sous-playbooks.

- include: playbook_commandserver.yml
- include: playbook_agent.yml

Dans le playbook_commandserver.yml, je crée le serveur de commandes (sur aws). Ensuite, je déclenche un rôle, qui utilise le set_factmodule pour se souvenir du nom DNS du serveur de commandes:

- name: Get hostname of command server
  shell: /usr/bin/host $(/usr/bin/curl -s http://ipecho.net/plain) | /usr/bin/awk '{print $5}' | /usr/bin/awk -F 'aws.com' '{print $1"aws.com"}'
  register: cs
- name: Set hostname of command server as fact
  set_fact: commandserver="{{ cs.stdout }}"

Le commandserverfait est disponible dans le même jeu, mais pas dans le même livre de jeu .. et encore moins dans le playbook_agent.yml, qui est inclus, après. Et c'est exactement là, où j'aurais besoin d'accéder à ce fait de serveur de commande.

Alors, comment définit-on / stocke-t-on des variables qui sont valables pour la totalité du cycle ansible?

J'ai trouvé ceci: /programming/26732241/ansible-save-registered-variable-to-file Cependant pour moi, cela ressemble à un vilain hack.

N'y a-t-il pas une meilleure solution à ce problème? N'y a-t-il aucun moyen de définir une variable valable pour l'ensemble de la course ansible?

doh-nutz
la source

Réponses:

12

Oui, c'est possible. Lorsque vous définissez un fait avec le set_factmodule, ce fait est accessible via "hostvars". Donc, si vous définissez votre serveur de commandes variable comme ceci:

  - name: Set hostname of command server as fact
    set_fact: commandserver="{{ cs.stdout }}"

alors vous pouvez accéder à cette variable dans d'autres playbooks inclus du même jeu de cette façon (le module de débogage n'est qu'un exemple):

  - debug: msg="{{ hostvars['put the hostname in here']['commandserver'] }}"
A.Hab
la source