Ansible : enregistrer un dictionnaire dans un fichier yaml local

Il est possible d'enregistrer le contenu d'un dictionnaire (en mémoire du playbook en train de s'exécuter) dans un fichier yaml. Ce fichier sera écrit sur la machine maitre.

Lors de l'exécution d'un playbook, il arrive qu'on utilise un dictionnaire pour garder des informations. Il est possible de sauvegarder ce dictionnaire au format yaml dans un fichier local à la machine qui exécute le playbook.

Pour le faire, il faut utiliser la directive local_action, avec comme arguments :

A noter que si le playbook utilise become pour passer root, il faut ajouter à la tâche become: no

Exemple :

---
- name: Get VM info to check compliance with install requirements
  hosts: all
  gather_facts: yes
  become: yes
  become_user: root
  become_method: sudo
  vars_files:
    - keys
  tasks:
    - name: Init env by setting facts
      set_fact:
        vms_stats: {}
        results_files: "{{ playbook_dir }}/reports/yaml"

    # globals checks
    - include: "vm_checks/{{ item }}.yml"
      with_items:
        - playbook_get_facts
        # [...snip...]
        - playbook_get_chage

    # specific to RHEL 6
    - include: "vm_checks/rhel6/{{ item }}.yml"
      with_items:
        - playbook_check_lca
        - playbook_check_nagios
      when: ansible_distribution_major_version|int == 6

    # specific to RHEL 7 (because of systemd)
    - include: "vm_checks/rhel7/{{ item }}.yml"
      with_items:
        - playbook_check_lca
        - playbook_check_nagios
      when: ansible_distribution_major_version|int == 7

    - name: Save execution results
      local_action: copy content={{ vms_stats|to_nice_yaml }} dest={{ results_files }}/{{ ansible_hostname }}_{{ inventory_hostname }}.yaml
      become: no

Autre astuce, quand le playbook principal utilise des include, les playbooks ainsi appelés peuvent utiliser le dictionnaire global :

---
- name: Extract default ipv4  from facts
  set_fact:
    vms_stats: >
      {{ vms_stats | combine( {'default_ipv4': ansible_default_ipv4} )}}