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

7

Estou tentando recuperar o ID do grupo de dois grupos ( syslog e utmp ) pelo nome usando uma tarefa Ansível. Para fins de teste, criei um manual para recuperar as informações do host 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 posso consolidar uma tarefa como essa em um formulário parametrizado ao registrar variáveis separadas , uma por item , para uso posterior? Portanto, o objetivo é ter variáveis baseadas no nome do grupo, que podem ser usadas em tarefas posteriores.

Estou usando o filtro int em gid_syslog.stdout e gid_utmp.stdout para fazer alguns cálculos com base no GID em tarefas posteriores.

Eu também tentei usar gid.{{item}} e gid[item] em 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
    
por 0xC0000022L 11.06.2015 / 01:10

1 resposta

7

Suponho que não há um caminho fácil para isso. E register com with_items loop 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ê não pode usar expansão de variável em set_fact de chaves como esta:

    - set_fact:
        "gid_{{item.item}}": "{{item}}"
      with_items: gids.results
    
por 11.06.2015 / 03:08

Tags