Come registrerei una variabile con nome dinamico in un'attività Ansible?


11

Sto cercando di recuperare l'ID gruppo di due gruppi ( sysloge utmp) per nome usando un'attività Ansible. A scopo di test ho creato un playbook per recuperare le informazioni dall'host Ansible stesso.

---
- 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

Sfortunatamente visualizzo il seguente errore durante l'esecuzione del playbook:

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

Come posso consolidare un'attività come questa in una forma parametrizzata durante la registrazione di variabili separate , una per articolo , per un uso successivo? Quindi l' obiettivo è avere variabili basate sul nome del gruppo che possono essere utilizzate in attività successive.

Sto usando il intfiltro gid_syslog.stdoute gid_utmp.stdoutper fare alcuni calcoli basati sul GID nelle attività successive.


Ho anche provato a utilizzare gid.{{item}}e gid[item]invece di gid_{{item}}non avere alcun risultato.


Quanto segue funziona bene in contrasto con quanto sopra:

---
- 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

Risposte:


8

Suppongo che non ci sia un modo semplice per farlo. E registercon with_itemsloop inserisce tutti i risultati in un array variable.results. Prova le seguenti attività:

  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}}"

Non è possibile utilizzare l'espansione variabile in set_factchiavi come questa:

    - set_fact:
        "gid_{{item.item}}": "{{item}}"
      with_items: gids.results

Grazie, lo proverò, ma è improbabile che io abbia messo quella soluzione in quanto è più lunga e più contorta di quella che avrei duplicato tutto (in fondo alla mia domanda). La leggibilità è uno dei punti di forza di Ansible altrimenti, quindi aggirare il problema tornerà a mordermi :)
0xC0000022L

1

Set fact supporta le variabili, al contrario dell'istruzione della soluzione precedente

   - set_fact:
       "{{ item.name }}": "{{ item.val }}"
     when: item.name not in vars
     with_items:
       - { name: test, val: myalue }
       - { name: notest, val: novalue }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.