Aller au contenu

Réutilisation de variables ansible entre différentes tâches

L'utilisation des variables dans ansible est parfois une plaie.

Imaginons un cas simple, nous souhaitons faire un check sur un serveur précis, puis déployé sur une flotte de serveur identiques. Dans ce cas simple, il semblerait trivial d'executer la tache A sur le serveur A, puis d'appliquer aux serveurs B, C et D, ce qui nous donnerait ce playbook :

File : wrong_playbook.yml
- name: Task A
  hosts: host_a
  tasks:
    - name: Check Task Version
      ansible.builtin.shell: php check
      register: neededupdate

- name: Update youtube-dl on servers
  vars:
    update: "{{ neededupdate.stdout }}"
  hosts:
    - host_a
    - host_b
    - host_c
    - host_d
  tasks:
    - name: Upgrade & install youtube-dl via PIP3
      ansible.builtin.pip:
        name: youtube-dl
      when: "'new_version_available' in neededupdate"

Malheureusement, cet exemple ne peut pas marcher. Pour rappel, les variables ansible ont comme portée leur host d'exécution, plutôt ballot. Il faudrait donc qu'on puisse indiquer à ansible d'utiliser une variable d'un host spécifique sur un ensemble d'host.

Heureusement, ansible a tout prévu avec le keyword hostvars qui permet d'accéder a une variable d'un host spécifique

File : correct_playbook.yml
- name: Task A
  hosts: host_a
  tasks:
    - name: Check Task Version
      ansible.builtin.shell: php check
      register: neededupdate

- name: Update youtube-dl on servers
  vars:
    update: "{{ neededupdate.stdout }}"
  hosts:
    - host_a
    - host_b
    - host_c
    - host_d
  tasks:
    - name: Upgrade & install youtube-dl via PIP3
      ansible.builtin.pip:
        name: youtube-dl
      when: "'new_version_available' in hostvars['host_a']['neededupdate']['stdout']"