Jak zarejestrować zmienną o nazwie dynamicznej w zadaniu Ansible?

11

Próbuję pobrać identyfikator grupy dwóch grup ( syslogi utmp) według nazwy za pomocą zadania Ansible. Do celów testowych stworzyłem podręcznik, aby pobrać informacje z samego hosta Ansible.

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

Niestety podczas uruchamiania playbooka pojawia się następujący błąd:

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

Jak skonsolidować takie zadanie w sparametryzowaną formę, rejestrując osobne zmienne, po jednej na element , do późniejszego wykorzystania? Dlatego celem jest posiadanie zmiennych opartych na nazwie grupy, które mogą być następnie wykorzystane w późniejszych zadaniach.

Używam intfiltra gid_syslog.stdouti gid_utmp.stdoutwykonuję obliczenia na podstawie GID w późniejszych zadaniach.


Próbowałem także użyć gid.{{item}}i gid[item]zamiast gid_{{item}}bezskutecznie.


Następujące działa dobrze w przeciwieństwie do powyższego:

---
- 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
źródło

Odpowiedzi:

8

Przypuszczam, że nie ma na to łatwego sposobu. A registerdzięki with_itemspętli po prostu umieszcza wszystkie ich wyniki w tablicy variable.results. Wypróbuj następujące zadania:

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

Nie można użyć rozszerzania zmiennej w set_factkluczach takich jak to:

    - set_fact:
        "gid_{{item.item}}": "{{item}}"
      with_items: gids.results
yaegashi
źródło
Dzięki, wypróbuję to, ale jest mało prawdopodobne, że postawię to rozwiązanie, ponieważ jest dłuższe i bardziej skomplikowane niż nawet to, w którym wszystko powielam (na dole mojego pytania). Czytelność to jedna z mocnych stron Ansible, więc obejście tego wróci, by mnie ugryźć :)
0xC0000022L
Zestaw fakt obsługuje zmienne, w przeciwieństwie do oświadczenia z poprzedniego rozwiązania, patrz odpowiedź poniżej
Vano
2

Zestaw fakt obsługuje zmienne, w przeciwieństwie do oświadczenia z poprzedniego rozwiązania

   - set_fact:
       "{{ item.name }}": "{{ item.val }}"
     when: item.name not in vars
     with_items:
       - { name: test, val: myalue }
       - { name: notest, val: novalue }
ww12
źródło
1
Dałbym to +10, gdybym mógł! :)
Vano