Ansible:获取当前目标主机的IP地址
Ansible: get current target host's IP address
如何获取角色中当前主机的IP地址?
我知道您可以获得主机所属组的列表以及主机的主机名,但我无法找到获取 IP 地址的解决方案。
您可以使用 {{inventory_hostname}}
获取主机名,使用 {{group_names}}
获取组
我试过 {{ hostvars[{{ inventory_hostname }}]['ansible_ssh_host'] }}
和 ip="{{ hostvars.{{ inventory_hostname }}.ansible_ssh_host }}"
您可以从 hostvars
、字典 ansible_default_ipv4
和密钥 address
获取 IP 地址
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']
所有地址的列表存储在事实 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
然后为每个网络接口分配地址...在这种情况下,您可以显示所有事实并找到具有您要使用的值的那个。
您可以在 template.j2 中使用 {{ ansible_eth0.ipv4.address }}
,就像使用 {{inventory_hostname}}
一样。
ps:请参阅以下博文以获取有关 HOW TO COLLECT INFORMATION ABOUT REMOTE HOSTS WITH ANSIBLE GATHERS FACTS 的更多信息
。
'希望有一天能对某人有所帮助 ッ
如果您想要外部public IP并且您在AWS或Azure等云环境中,您可以使用ipify_facts module:
# 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:
这会将 public IP 放入变量 ipify_public_ip
。
http://docs.ansible.com/ansible/latest/plugins/lookup/dig.html
所以在模板中,对于 e。 g.:
{{ lookup('dig', ansible_host) }}
备注:
- 因为不仅 DNS 名称可以在清单中使用,所以最好添加检查它是否不是 IP
- 很明显,对于间接主机规范(例如使用跳转主机),此收据不能按预期工作
但它仍然服务于 99%(打个比方)的用例。
以下代码段将 return 远程计算机的 public 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'] }}"
另一种查找 public IP 的方法是使用 uri
模块:
- name: Find my public ip
uri:
url: http://ifconfig.me/ip
return_content: yes
register: ip_response
您的 IP 将在 ip_response.content
普通 ansible_default_ipv4.address
可能不是您在 some cases 中的想法,请使用:
ansible_default_ipv4.address|default(ansible_all_ipv4_addresses[0])
简单调试命令:
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"
}
只需使用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
Result
TASK [Show host's ip] *********************************************************************************************************************************************************************************************
ok: [host1] => {
"msg": "1.2.3.4"
}
在我的例子中,我需要保留 IP 然后 运行 使用 delegate_to
的命令,所以我在变量中写了如下内容:
leader_ip: '{{ansible_ssh_host}}'
然后我用了 leader_ip
.
另一个解决方案是使用 hostvar
:
hostvars[INVENTORY_HOSTNAME]['ansible_host']
如何获取角色中当前主机的IP地址?
我知道您可以获得主机所属组的列表以及主机的主机名,但我无法找到获取 IP 地址的解决方案。
您可以使用 {{inventory_hostname}}
获取主机名,使用 {{group_names}}
我试过 {{ hostvars[{{ inventory_hostname }}]['ansible_ssh_host'] }}
和 ip="{{ hostvars.{{ inventory_hostname }}.ansible_ssh_host }}"
您可以从 hostvars
、字典 ansible_default_ipv4
和密钥 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']
所有地址的列表存储在事实 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
然后为每个网络接口分配地址...在这种情况下,您可以显示所有事实并找到具有您要使用的值的那个。
您可以在 template.j2 中使用 {{ ansible_eth0.ipv4.address }}
,就像使用 {{inventory_hostname}}
一样。
ps:请参阅以下博文以获取有关 HOW TO COLLECT INFORMATION ABOUT REMOTE HOSTS WITH ANSIBLE GATHERS FACTS 的更多信息 。
'希望有一天能对某人有所帮助 ッ
如果您想要外部public IP并且您在AWS或Azure等云环境中,您可以使用ipify_facts module:
# 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:
这会将 public IP 放入变量 ipify_public_ip
。
http://docs.ansible.com/ansible/latest/plugins/lookup/dig.html
所以在模板中,对于 e。 g.:
{{ lookup('dig', ansible_host) }}
备注:
- 因为不仅 DNS 名称可以在清单中使用,所以最好添加检查它是否不是 IP
- 很明显,对于间接主机规范(例如使用跳转主机),此收据不能按预期工作
但它仍然服务于 99%(打个比方)的用例。
以下代码段将 return 远程计算机的 public 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'] }}"
另一种查找 public IP 的方法是使用 uri
模块:
- name: Find my public ip
uri:
url: http://ifconfig.me/ip
return_content: yes
register: ip_response
您的 IP 将在 ip_response.content
普通 ansible_default_ipv4.address
可能不是您在 some cases 中的想法,请使用:
ansible_default_ipv4.address|default(ansible_all_ipv4_addresses[0])
简单调试命令:
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"
}
只需使用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
Result
TASK [Show host's ip] *********************************************************************************************************************************************************************************************
ok: [host1] => {
"msg": "1.2.3.4"
}
在我的例子中,我需要保留 IP 然后 运行 使用 delegate_to
的命令,所以我在变量中写了如下内容:
leader_ip: '{{ansible_ssh_host}}'
然后我用了 leader_ip
.
另一个解决方案是使用 hostvar
:
hostvars[INVENTORY_HOSTNAME]['ansible_host']