我想循环遍历特定组的所有主机的变量。
hostvars 中包含以下数据(简化):
{
"server1": {
"group_names": ["web"],
"sites": {
"website1": { "id": "site1", "domain": "..." }
"website2": { "id": "site2", "domain": "..." }
},
}
"server2": {
"group_names": ["web"],
"sites": {
"website3": { "id": "site3", "domain": "..." }
}
}
}
我想要在第三台服务器(数据库服务器)上创建所有数据库:
- name: create databases
- mysql_db:
name: "{{ item.1.id }}"
- with_subelements:
- "{{ groups["web"] }}"
- "{{ hostvars[item.0]['sites']
这不起作用,我出现错误:{"failed": true, "msg": "'item' is undefined"}
我该怎么写这个角色?
答案1
这里有一些神社魔法给你:
存货:
localhost ansible_ssh_host=127.0.0.1 ansible_connection=local
[web]
host1 sites="{'web1':{'id':'z1'},'web2':{'id':'z2'}}"
host2 sites="{'web3':{'id':'z3'}}"
演示:
---
- hosts: localhost
gather_facts: no
tasks:
- debug:
msg: "Site name – {{ item.key }}, id - {{ item.value.id }}"
with_dict: "{{ dict(groups['web'] | map('extract',hostvars,'sites') | map('dictsort') | sum(start=[]) | list) }}"
我确实使用了dictsort->sum->dict
技巧,因为你的sites
对象是一个字典(而不是列表),并且迭代嵌套字典并不容易。