Ansible:获取当前目标主机的IP地址


100

如何获得角色中当前主机的IP地址?

我知道您可以获得主机所属的组的列表以及主机的主机名,但是我无法找到获取IP地址的解决方案。

您可以使用来获取主机名,{{inventory_hostname}}并使用来获取组{{group_names}}

我曾尝试喜欢的东西{{ hostvars[{{ inventory_hostname }}]['ansible_ssh_host'] }}ip="{{ hostvars.{{ inventory_hostname }}.ansible_ssh_host }}"

Answers:


124

所有地址的列表存储在事实中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

然后为每个网络接口分配了地址...在这种情况下,您可以显示所有事实并找到具有您要使用的值的事实。


您如何显示所有标志?
SJC

1
您可以列出任务中的所有标志吗?
SJC

2
@SJC标志?你是说事实,对不对?是的,运行setup:模块register: allfacts并与- debug: var=allfacts
一起

4
的价值gather_facts必须是true这项才能奏效。默认情况下为true,但如果不需要有关主机的信息,则可以将其设置为false。
shshnk

1
@poige如果您问一个新的问题,那可能是不正确的。
techraf

69

您可以从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']

在某些情况下,这可能会失败,请参见:medium.com/opsops/…–
RafalS

25

您可以在template.j2中{{ ansible_eth0.ipv4.address }}使用相同的方法{{inventory_hostname}}

ps:请参考以下博客文章,以获取有关如何收集具有可移植选民事实的远程主机信息的 更多信息。

希望有一天有帮助的人


13
要格外小心。如今,默认网络接口并不总是'eth0'。它有时称为ens3enp2s0等东西。如果您使用ansible_default_ipv4它,如果它不起作用,您会拥有更好的选择,然后转回寻找一些合理的默认值。
Gabor Garami

4
这可能过去曾经有用,但是在Ansible 2.7中,此变量未定义。
德克

5

如果您需要外部公共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变量是空的
Davide

2
对于AWS,inventory_hostname将是IP地址。
Berend de Boer '18

此插件可以在特定情况下工作,如果您要从NAT后面访问Internet,则它将无法工作。基本上,这在服务器可以通过Internet访问并且可以访问ipify.org网站以在访问该网站时解析其外部IP时起作用。
slm

1
@BerenddeBoer错误。inventory_hostname是库存中设置的任何内容。它可以是中设置的主机名.ssh/config
Teresa e Junior

如我所说,@ slm,如果您正在寻找外部公共IP。如果您位于NAT之后,那么您将没有外部可公开访问的IP,因此您将不会使用此方法。
西蒙·伍德赛德

4

查找公共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
Paul Parker

@PaulParker ipecho.net/plain似乎很不错,或者询问api令牌... ifconfig.me多年来提供了更好,更稳定的服务:+1
巴斯蒂安

从未被要求提供API令牌。我无法说出服务的一致性,我没有监视它,但是它从未使我失望。
保罗·帕克

2

简单的调试命令:

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"
}

1

http://docs.ansible.com/ansible/latest/plugins/lookup/dig.html

因此在模板中,例如:

{{ lookup('dig', ansible_host) }}

笔记:

  • 由于不仅DNS名称可以在清单中使用,还可以检查是否已经添加了IP
  • 显然,此收据对间接主机规范不起作用(例如,使用跳转主机)

但是仍然可以满足99%(用数字表示)的用例。


1
如果环境中不使用DNS,该怎么办?
techraf

(或者,我感到您很痛苦。否则,您将不会问这样的幼稚问题。)—如果清单中未使用DNS,请按照我的回答直接使用ansible_host。
poige

1
Abs如果ansible_host不是所讨论主机的IP地址怎么办?
techraf

这不是“和什么”。这只是“什么”,因为您之前提出的问题没有计算在内,请不要忘记。
poige

1
我不知道您所说的“真实IP地址”。你知道一些虚幻的吗?
poige

1

ansible_default_ipv4.address某些情况下,平原可能不是您的想法,请使用:

ansible_default_ipv4.address|default(ansible_all_ipv4_addresses[0])

0

以下代码段将返回远程计算机的公共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'] }}"


2
您的一些评论将改善这个答案
Marged

0

只需使用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"
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.