Как мне зарегистрировать переменную с динамическим именем в задаче Ansible?

11

Я пытаюсь получить идентификатор группы двух групп ( syslogи utmp) по имени, используя задачу Ansible. Для тестирования я создал Playbook для получения информации от самого хоста 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

К сожалению, я получаю следующую ошибку при запуске playbook:

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

Как я могу объединить задачу, подобную этой, в параметризованную форму, регистрируя отдельные переменные, по одной на элемент , для последующего использования? Таким образом, цель состоит в том, чтобы иметь переменные, основанные на имени группы, которые затем могут быть использованы в последующих задачах.

Я использую intфильтр gid_syslog.stdoutи gid_utmp.stdoutдля некоторых вычислений на основе GID в последующих задачах.


Я тоже пытался использовать gid.{{item}}и gid[item]вместо того, gid_{{item}}чтобы безрезультатно.


Следующее работает отлично в отличие от вышеупомянутого:

---
- 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
источник

Ответы:

8

Я полагаю, что нет простого способа для этого. А registerс with_itemsциклом просто помещает все результаты из них в массив variable.results. Попробуйте следующие задачи:

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

Вы не можете также использовать расширение переменных в set_factключах как это:

    - set_fact:
        "gid_{{item.item}}": "{{item}}"
      with_items: gids.results
yaegashi
источник
Спасибо, я попробую, но вряд ли я поставлю это решение, так как оно длиннее и более замысловато, чем даже то, где я все продублировал (внизу моего вопроса). В противном случае удобочитаемость - одна из сильных сторон Ansible, так что работа над этим вернется, чтобы укусить меня :)
0xC0000022L
1

Набор факт поддерживает переменные, в отличие от предыдущего решения решения

   - set_fact:
       "{{ item.name }}": "{{ item.val }}"
     when: item.name not in vars
     with_items:
       - { name: test, val: myalue }
       - { name: notest, val: novalue }
ww12
источник