ansible:列表理解?

时间:2014-10-21 16:09:57

标签: ansible ansible-playbook

鉴于此库存:

[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']" 

3 个答案:

答案 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
    }, 
    ....
根据您的尝试,

可能也更合适。

祝你好运。