【发布时间】:2026-02-09 23:00:01
【问题描述】:
我的基本问题是,在创建一组 aws 服务器后,我想将它们配置为相互了解。
创建每个服务器后,它们的详细信息都会保存在已注册的“服务器”变量中(如下所示)。创建后我真正想做的是运行这样的任务:
- name: Add servers details to all other servers
lineinfile:
dest: /path/to/configfile
line: "servername={{ item.1.private_ip }}"
delegate_to: "{{ item.0.public_dns_name }}"
with_nested:
- list_of_servers
- list_of_servers
这里必须将列表两次提供给“with_nested”。
获取列表很容易做到:
"{{ servers.results | map(attribute='tagged_instances') | list }}"
返回:
[
[ { "private_ip": "ip1", "public_dns_name": "dns1" } , { ... }],
[ { ... }, { ... } ]
]
但是你会怎么把它变成:
[
{ "private_ip": "ip1", "public_dns_name": "dns1" },
{ ... },
{ ... },
{ ... }
]
“服务器”注册的变量如下所示:
"servers": {
"changed": true,
"msg": "All items completed",
"results": [
{
...
"tagged_instances": [
{
...
"private_ip": "ip1",
"public_dns_name": "dns1",
...
},
{
...
"private_ip": "ip2",
"public_dns_name": "dns2",
...
}
]
},
{
...
"tagged_instances": [
{
...
"private_ip": "ip3",
"public_dns_name": "dn3",
...
},
{
...
"private_ip": "ip4",
"public_dns_name": "dns4",
...
}
]
},
...
]
}
注意:我有一个非常丑陋的解决方案,它使用“with_flattened”和一个调试语句来创建一个新的注册变量“flattened_servers”,然后我再次映射它。但我希望有一个更优雅的解决方案:)
【问题讨论】:
标签: jinja2 ansible ansible-playbook