Як я можу зареєструвати змінну, що динамічно називається, у завдання Ansible?


11

Я намагаюся отримати ідентифікатор групи двох груп ( syslogі utmp) за назвою, використовуючи завдання Ansible. З метою тестування я створив ігрову книжку, щоб отримати інформацію від самого хазяїна 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

На жаль, я отримую таку помилку під час запуску книги.

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

Відповіді:


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

Дякую, я спробую це, але навряд чи я б поставив це рішення, оскільки воно довше і складніше, ніж навіть те, що я копіював усе (внизу запитання). Читання - одна з сильних сторін Ansible в іншому випадку, тому обробка, яка повернеться, щоб мене кусати :)
0xC0000022L

Встановити факт підтримує змінні, на відміну від твердження попереднього рішення, див. Відповідь нижче
Vano

2

Встановлений факт підтримує змінні, на відміну від твердження попереднього рішення

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

1
Я б дав +10, якби міг! :)
Вано
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.