Ansible 작업에 동적으로 명명된 변수를 등록하는 방법은 무엇입니까?

Ansible 작업에 동적으로 명명된 변수를 등록하는 방법은 무엇입니까?

syslogAnsible 작업을 사용하여 두 그룹(및)의 그룹 ID를 이름으로 검색하려고 합니다 . utmp테스트 목적으로 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.stdoutGID를 기반으로 몇 가지 계산을 수행합니다.


나는 또한 대신에 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

답변1

Setfact는 이전 솔루션의 선언과 달리 변수를 지원합니다.

- set_fact:
    "{{ item.name }}": "{{ item.val }}"
  when: item.name not in vars           # this is optional. prevents overwriting vars
  with_items:
    - { name: test, val: myalue }
    - { name: notest, val: novalue }

답변2

이 작업을 수행하는 쉬운 방법은 없다고 생각합니다. 그리고 registerwith 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

관련 정보