Answers:
所有地址的列表存储在事实中ansible_all_ipv4_addresses
,默认地址存储在中ansible_default_ipv4.address
。
---
- hosts: localhost
connection: local
tasks:
- debug: var=ansible_all_ipv4_addresses
- debug: var=ansible_default_ipv4.address
然后为每个网络接口分配了地址...在这种情况下,您可以显示所有事实并找到具有您要使用的值的事实。
setup:
模块register: allfacts
并与- debug: var=allfacts
gather_facts
必须是true
这项才能奏效。默认情况下为true,但如果不需要有关主机的信息,则可以将其设置为false。
您可以从hostvars
,字典ansible_default_ipv4
和密钥获取IP地址address
hostvars[inventory_hostname]['ansible_default_ipv4']['address']
和IPv6地址
hostvars[inventory_hostname]['ansible_default_ipv6']['address']
一个示例剧本:
---
- hosts: localhost
tasks:
- debug: var=hostvars[inventory_hostname]['ansible_default_ipv4']['address']
- debug: var=hostvars[inventory_hostname]['ansible_default_ipv6']['address']
您可以在template.j2中{{ ansible_eth0.ipv4.address }}
使用相同的方法{{inventory_hostname}}
。
ps:请参考以下博客文章,以获取有关如何收集具有可移植选民事实的远程主机信息的 更多信息。
希望有一天有帮助的人
ens3
或enp2s0
等东西。如果您使用ansible_default_ipv4
它,如果它不起作用,您会拥有更好的选择,然后转回寻找一些合理的默认值。
如果您需要外部公共IP,并且处于AWS或Azure之类的云环境中,则可以使用ipify_facts模块:
# TODO: SECURITY: This requires that we trust ipify to provide the correct public IP. We could run our own ipify server.
- name: Get my public IP from ipify.org
ipify_facts:
这会将公共IP放入变量中ipify_public_ip
。
ipify_public_ip
变量是空的
inventory_hostname
是库存中设置的任何内容。它可以是中设置的主机名.ssh/config
。
查找公共IP的另一种方法是使用uri
模块:
- name: Find my public ip
uri:
url: http://ifconfig.me/ip
return_content: yes
register: ip_response
您的IP将在 ip_response.content
https://ipecho.net/plain
简单的调试命令:
ansible -i inventory/hosts.yaml -m debug -a "var=hostvars[inventory_hostname]" all
输出:
"hostvars[inventory_hostname]": {
"ansible_check_mode": false,
"ansible_diff_mode": false,
"ansible_facts": {},
"ansible_forks": 5,
"ansible_host": "192.168.10.125",
"ansible_inventory_sources": [
"/root/workspace/ansible-minicros/inventory/hosts.yaml"
],
"ansible_playbook_python": "/usr/bin/python2",
"ansible_port": 65532,
"ansible_verbosity": 0,
"ansible_version": {
"full": "2.8.5",
"major": 2,
"minor": 8,
"revision": 5,
"string": "2.8.5"
},
获取主机IP地址:
ansible -i inventory/hosts.yaml -m debug -a "var=hostvars[inventory_hostname].ansible_host" all
zk01 | SUCCESS => {
"hostvars[inventory_hostname].ansible_host": "192.168.10.125"
}
http://docs.ansible.com/ansible/latest/plugins/lookup/dig.html
因此在模板中,例如:
{{ lookup('dig', ansible_host) }}
笔记:
但是仍然可以满足99%(用数字表示)的用例。
ansible_host
不是所讨论主机的IP地址怎么办?
以下代码段将返回远程计算机的公共IP以及默认IP(即:LAN)
这还将在引号中打印ip,以避免在使用配置文件时造成混淆。
>> main.yml
---
- hosts: localhost
tasks:
- name: ipify
ipify_facts:
- debug: var=hostvars[inventory_hostname]['ipify_public_ip']
- debug: var=hostvars[inventory_hostname]['ansible_default_ipv4']['address']
- name: template
template:
src: debug.j2
dest: /tmp/debug.ansible
>> templates/debug.j2
public_ip={{ hostvars[inventory_hostname]['ipify_public_ip'] }}
public_ip_in_quotes="{{ hostvars[inventory_hostname]['ipify_public_ip'] }}"
default_ipv4={{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}
default_ipv4_in_quotes="{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}"
只需使用ansible_ssh_host
变量
playbook_example.yml
- hosts: host1
tasks:
- name: Show host's ip
debug:
msg: "{{ ansible_ssh_host }}"
hosts.yml
[hosts]
host1 ansible_host=1.2.3.4
结果
TASK [Show host's ip] *********************************************************************************************************************************************************************************************
ok: [host1] => {
"msg": "1.2.3.4"
}