![如何在 Ansible 任务中注册动态命名变量?](https://linux22.com/image/66739/%E5%A6%82%E4%BD%95%E5%9C%A8%20Ansible%20%E4%BB%BB%E5%8A%A1%E4%B8%AD%E6%B3%A8%E5%86%8C%E5%8A%A8%E6%80%81%E5%91%BD%E5%90%8D%E5%8F%98%E9%87%8F%EF%BC%9F.png)
我正在尝试使用 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
不幸的是,我在运行剧本时收到以下错误:
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
答案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
我想没有简单的方法可以做到这一点。而register
withwith_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