Comment enregistrer une variable nommée dynamiquement dans une tâche Ansible?

11

J'essaie de récupérer l'ID de groupe de deux groupes ( sysloget utmp) par nom à l'aide d'une tâche Ansible. À des fins de test, j'ai créé un playbook pour récupérer les informations de l'hôte Ansible lui-même.

---
- name: My playbook
  hosts: enabled
  sudo: True
  connection: local
  gather_facts: False
  tasks:
    - name: Determine GIDs
      shell: "getent group {{ item }} | cut -d : -f 3"
      register: gid_{{item}}
      failed_when: gid_{{item}}.rc != 0
      changed_when: false
      with_items:
        - syslog
        - utmp

Malheureusement, j'obtiens l'erreur suivante lors de l'exécution du playbook:

fatal: [hostname] => error while evaluating conditional: gid_syslog.rc != 0

Comment puis-je consolider une tâche comme celle-ci dans un formulaire paramétré tout en enregistrant des variables distinctes , une par article , pour une utilisation ultérieure? Le but est donc d'avoir des variables basées sur le nom du groupe qui peuvent ensuite être utilisées dans des tâches ultérieures.

J'utilise le intfiltre gid_syslog.stdoutet gid_utmp.stdoutje fais un calcul basé sur le GID dans les tâches ultérieures.


J'ai également essayé d'utiliser gid.{{item}}et gid[item]au lieu de gid_{{item}}vain.


Les éléments suivants fonctionnent bien contrairement à ce qui précède:

---
- name: My playbook
  hosts: enabled
  sudo: True
  connection: local
  gather_facts: False
  tasks:
    - name: Determine syslog GID
      shell: "getent group syslog | cut -d : -f 3"
      register: gid_syslog
      failed_when: gid_syslog.rc != 0
      changed_when: false
    - name: Determine utmp GID
      shell: "getent group utmp | cut -d : -f 3"
      register: gid_utmp
      failed_when: gid_utmp.rc != 0
      changed_when: false
0xC0000022L
la source

Réponses:

8

Je suppose qu'il n'y a pas de moyen facile pour cela. Et registeravec with_itemsboucle, il suffit de mettre tous les résultats dans un tableau variable.results. Essayez les tâches suivantes:

  tasks:
    - name: Determine GIDs
      shell: "getent group {{ item }} | cut -d : -f 3"
      register: gids
      changed_when: false
      with_items:
        - syslog
        - utmp
    - debug:
        var: gids
    - assert:
        that:
          - item.rc == 0
      with_items: gids.results
    - set_fact:
        gid_syslog: "{{gids.results[0]}}"
        gid_utmp: "{{gids.results[1]}}"
    - debug:
        msg: "{{gid_syslog.stdout}} {{gid_utmp.stdout}}"

Vous ne pouvez pas non plus utiliser l'expansion variable dans des set_factclés comme celle-ci:

    - set_fact:
        "gid_{{item.item}}": "{{item}}"
      with_items: gids.results
yaegashi
la source
Merci, je vais l'essayer, mais il est peu probable que je mette cette solution car elle est plus longue et plus compliquée que même celle où j'ai tout reproduit (au bas de ma question). La lisibilité est l'un des points forts d'Ansible autrement, alors contourner cela reviendra me mordre :)
0xC0000022L
Définir les variables de supports d'information, par opposition à la déclaration de la solution précédente, voir réponse ci - dessous
Vano
2

Set fact prend en charge les variables, contrairement à la déclaration de la solution précédente

   - set_fact:
       "{{ item.name }}": "{{ item.val }}"
     when: item.name not in vars
     with_items:
       - { name: test, val: myalue }
       - { name: notest, val: novalue }
ww12
la source
Je lui donnerais +10 si je pouvais! :)
Vano Il y a