Ansible
如何在 Ansible 任務中註冊動態命名的變數?
我正在嘗試使用 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.stdout
並gid_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 }