Ansible

如何在 Ansible 任務中註冊動態命名的變數?

  • September 8, 2020

我正在嘗試使用 Ansible 任務按名稱檢索兩個組 (syslog和) 的組 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

不幸的是,我在執行 playbook 時收到以下錯誤:

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

如何將這樣的任務合併為參數化形式,同時註冊單獨的變數,每個項目一個,以供以後使用?所以目標是根據組名創建變數,然後可以在以後的任務中使用。

我正在使用int過濾器gid_syslog.stdoutgid_utmp.stdout在​​以後的任務中基於 GID 進行一些計算。


我也嘗試使用gid.{{item}}andgid[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

我想這沒有簡單的方法。而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

Set fact 支持變數,而不是之前的解決方案的聲明

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

引用自:https://unix.stackexchange.com/questions/208838