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

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

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 }

Je lui donnerais +10 si je pouvais! :)
Vano Il y a
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.