Como eu registraria uma variável nomeada dinamicamente em uma tarefa Ansible?

11

Estou tentando recuperar a identificação do grupo de dois grupos ( sysloge utmp) pelo nome usando uma tarefa Ansible. Para fins de teste, criei um manual para recuperar as informações do próprio 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

Infelizmente, recebo o seguinte erro ao executar o manual:

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

Como consolidar uma tarefa como esta em um formulário parametrizado enquanto registro variáveis separadas , uma por item , para uso posterior? Portanto, o objetivo é ter variáveis ​​baseadas no nome do grupo que possam ser usadas em tarefas posteriores.

Estou usando o intfiltro gid_syslog.stdoute gid_utmp.stdoutpara fazer alguns cálculos com base no GID em tarefas posteriores.


Eu também tentei usar gid.{{item}}e em gid[item]vez de gid_{{item}}sem sucesso.


O seguinte funciona bem em contraste com o acima:

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

Respostas:

8

Suponho que não há uma maneira fácil para isso. E registercom with_itemsloop apenas coloca todos os resultados deles em uma matriz variable.results. Tente as seguintes tarefas:

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

Você também não pode usar expansão variável em set_factchaves como esta:

    - set_fact:
        "gid_{{item.item}}": "{{item}}"
      with_items: gids.results
yaegashi
fonte
Obrigado, vou experimentar, mas é improvável que eu coloque essa solução, pois é mais longa e complicada do que a que eu duplicava tudo (na parte inferior da minha pergunta). Legibilidade é um dos pontos fortes de Ansible de outra forma, de modo a trabalhar em torno de que vai voltar a morder-me :)
0xC0000022L
1

O fato do conjunto suporta variáveis, em oposição à declaração da solução anterior

   - set_fact:
       "{{ item.name }}": "{{ item.val }}"
     when: item.name not in vars
     with_items:
       - { name: test, val: myalue }
       - { name: notest, val: novalue }
ww12
fonte