¿Cómo registraría una variable con nombre dinámico en una tarea Ansible?

11

Estoy tratando de recuperar el ID de grupo de dos grupos ( syslogy utmp) por nombre usando una tarea Ansible. Para fines de prueba, he creado un libro de jugadas para recuperar la información del 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

Lamentablemente, aparece el siguiente error al ejecutar el libro de jugadas:

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

¿Cómo puedo consolidar una tarea como esta en una forma parametrizada al registrar variables separadas , una por elemento , para su uso posterior? Por lo tanto, el objetivo es tener variables basadas en el nombre del grupo que luego puedan usarse en tareas posteriores.

Estoy usando el intfiltro gid_syslog.stdouty gid_utmp.stdoutpara hacer algunos cálculos basados ​​en el GID en tareas posteriores.


También intenté usar gid.{{item}}y en gid[item]lugar de gid_{{item}}nada.


Lo siguiente funciona bien en contraste con lo anterior:

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

Respuestas:

8

Supongo que no hay una manera fácil de hacerlo. Y registercon with_itemsloop solo pone todos los resultados de ellos en una matriz variable.results. Pruebe las siguientes tareas:

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

Tampoco puede usar la expansión variable en set_factclaves como esta:

    - set_fact:
        "gid_{{item.item}}": "{{item}}"
      with_items: gids.results
yaegashi
fuente
Gracias, lo probaré, pero es poco probable que ponga esa solución, ya que es más larga y complicada que incluso la que dupliqué todo (al final de mi pregunta). La legibilidad es uno de los puntos fuertes de Ansible de lo contrario, así que trabajar en eso volverá a morderme :)
0xC0000022L
1

Establecer hecho admite variables, en oposición a la declaración de la solución anterior

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