如何在Ansible中获取主机专用网络地址

如何在Ansible中获取主机专用网络地址,ansible,Ansible,我试过这样的方法: gather_facts: yes tasks: - debug: var=ansible_all_ipv4_addresses - set_fact: man_ip: "{{ item }}" with_items: ansible_all_ipv4_addresses when: "item.startswith('10.')" - debug: var=man_ip 它可以工作,但我使用docker的

我试过这样的方法:

gather_facts: yes
  tasks:
    - debug: var=ansible_all_ipv4_addresses
    - set_fact:
        man_ip: "{{ item }}"
      with_items: ansible_all_ipv4_addresses
      when: "item.startswith('10.')"
    - debug: var=man_ip
它可以工作,但我使用docker的服务器有问题,因为docker容器的接口地址也是以
10.x.x.x
开始的

那么,如何获取主机专用网络地址?

如何:

- debug: var="ansible_eth0['ipv4']['address']"


您可以使用
ansible\u all\u ip\u地址
fact和
ipaddr
过滤器

{{ ansible_all_ipv4_addresses | ipaddr('private') | first }}
注意:您可以通过
ansible-m setup localhost

编辑:您还可以使用
ipaddr

{{ ansible_all_ipv4_addresses | ipaddr('10.0.0.0/8') | first }}

ansible_eth0['ipv4']['address']
是否始终包含专用网络地址?否,这取决于它是如何设置的,或者在最坏的情况下:随机(有一些问题;-))当然,如果您启用了eth1或在无线上,您必须选择正确的接口。对我来说,它总是有效的。我在vanilla安装/设置中验证了它。@helloV我在SoftLayer使用服务器。因此,它不能保证私有网络总是在eth0中。我想这是相当棘手的,因为主机本身不知道私有/公共IP的概念。它只知道它有IP。所以可能没有干净的解决方案。您可能需要将该信息存储在某个位置,或者以某种方式检测到它—可能会将任务委托给另一台无法访问私有IP的主机,并尝试从那里ping它。
{{ ansible_all_ipv4_addresses | ipaddr('10.0.0.0/8') | first }}
- debug: var=hostvars[inventory_hostname].private_ipv4