Ansible 작업에서 동적으로 명명 된 변수를 어떻게 등록합니까?


11

Ansible 작업을 사용하여 이름 으로 두 그룹 ( syslogutmp) 의 그룹 ID를 검색하려고합니다 . 테스트 목적으로 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

쉬운 방법이 없다고 생각합니다. 그리고 registerwith with_itemsloop는 모든 결과를 배열에 넣습니다 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을 줄 것이다! :)
Vano
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.