鉴于此库存:
[webservers]
10.0.0.51 private_ip='X.X.X.X'
10.0.0.52 private_ip='Y.Y.Y.Y'
10.0.0.53 private_ip='Z.Z.Z.Z'
如何获取网络服务器的私人网址列表?
webservers_private_ips: "{{ }}" # ['X.X.X.X', 'Y.Y.Y.Y', 'Z.Z.Z.Z']
我知道groups['webservers']
会给我这个列表['10.0.0.51', '10.0.0.52', '10.0.0.53']
,我可以通过以下方式获取其中的private_ip:
{{ hostvars[item]['private_ip'] }}
with_items: groups['webservers']
但我想直接在我的var文件中声明一个变量,而没有任务来注册它。如果可以做到以下类似的事情会很好:
webservers_private_ips: "{{ hostvars[item]['private_ip'] }} for item in groups['webservers']"
答案 0 :(得分:5)
您可以利用'extract' filter获取复合数据对象的组件:
webservers_private_ips: "{{ groups['webservers']|map('extract', hostvars, 'private_ip')|list }}"
答案 1 :(得分:0)
从Ansible 2.2开始,您可以使用json_query
过滤器。
在您的示例中,它看起来像:
- debug:
msg: "{{item}}"
loop: "{{hostvars | json_query(query)}}"
vars:
query: "* | [?contains(group_names, `webservers`)].private_ip"
" HOSTVARS"是主机名(例如10.0.0.51)到其各自变量的散列。过滤器不能应用于哈希(请参阅this answer),因此我们需要使用" *"检索hostvar对象列表。生成的hostvars列表将针对组" webservers"中的主机进行过滤。对于所有匹配的哈希,查询返回" private_ip"。
的值文档:http://docs.ansible.com/ansible/latest/playbooks_filters.html#json-query-filter
答案 2 :(得分:-3)
这取决于具体情况。
如果你想在任务中循环private_ip
变量,你可以这样做:
- hosts: all
tasks:
- name: Print private_ips
debug: var={{ hostvars[item]['private_ip'] }}
with_items:
- "{{ groups['webservers'] }}"
请注意,这会打印3次IP,因为它会在每台服务器上运行,因此根据您要尝试实现的内容,您必须将hosts: all
设置为您的前端服务器或其他什么。
如果您计划生成一些配置文件,也可以在Jinja2文件中执行此操作。同样,这一切都取决于你的目标。
请注意,您可以访问由ansible自动收集的事实中的IP信息:
$ ansible someserver -m setup
....
"ansible_eth1": {
"active": true,
"device": "eth1",
"ipv4": {
"address": "192.168.252.6",
"netmask": "255.255.255.255",
"network": "192.168.252.6"
},
"mtu": 1500,
"promisc": false
},
....
根据您的尝试,可能也更合适。
祝你好运。