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

SJC*_*SJC 78 ansible ansible-template ansible-facts

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

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

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

我尝试过像{{ hostvars[{{ inventory_hostname }}]['ansible_ssh_host'] }}ip="{{ hostvars.{{ inventory_hostname }}.ansible_ssh_host }}"

tec*_*raf 102

所有地址的列表都存储在一个事实中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
Run Code Online (Sandbox Code Playgroud)

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

  • 为此,`gather_facts`的值必须为'true`才能生效.默认情况下为true,但如果不需要有关主机的信息,可以将其变为false. (4认同)
  • @SJC旗帜?你的意思是事实,对吗?是的,使用`register:allfacts`运行`setup:`模块并使用` - debug:var = allfacts`显示 (2认同)
  • 不正确的答案。默认 IP 地址不一定是 ansible 在播放过程中使用的地址 (2认同)
  • @poige 如果您问一个新问题,这可能是不正确的。 (2认同)

Pas*_*i H 59

您可以从hostvars,dict ansible_default_ipv4和key 获取IP地址address

hostvars[inventory_hostname]['ansible_default_ipv4']['address']
Run Code Online (Sandbox Code Playgroud)

和IPv6地址分别

hostvars[inventory_hostname]['ansible_default_ipv6']['address']
Run Code Online (Sandbox Code Playgroud)

一个示例剧本:

---
- hosts: localhost
  tasks:
    - debug: var=hostvars[inventory_hostname]['ansible_default_ipv4']['address']
    - debug: var=hostvars[inventory_hostname]['ansible_default_ipv6']['address']
Run Code Online (Sandbox Code Playgroud)

  • 在某些情况下这可能会失败,请参阅:https://medium.com/opsops/ansible-default-ipv4-is-not-what-you-think-edb8ab154b10 (2认同)

Ors*_*ius 23

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

ps:请参阅以下博客文章,了解有关如何收集有关远程主机信息的 更多信息.

'希望它有一天会帮助某人ッ

  • 要格外小心.如今,默认网络接口并不总是'eth0'.它有时称为"ens3"或"enp2s0"等等.如果您使用`ansible_default_ipv4`并且如果它不起作用,您可以更好地下注,然后切换回寻找一些合理的默认值. (9认同)
  • 这可能过去曾经起作用,但是在Ansible 2.7中,此变量未定义。 (2认同)

Raf*_*alS 12

在某些情况下,普通ansible_default_ipv4.address可能不是您所想的,请使用:

ansible_default_ipv4.address|default(ansible_all_ipv4_addresses[0])
Run Code Online (Sandbox Code Playgroud)


NOZ*_*IGH 9

简单的调试命令:

ansible -i inventory/hosts.yaml -m debug -a "var=hostvars[inventory_hostname]" all
Run Code Online (Sandbox Code Playgroud)

输出:

"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"
    }, 
Run Code Online (Sandbox Code Playgroud)

获取主机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"
}
Run Code Online (Sandbox Code Playgroud)

  • `ansible_host` 可能包含主机名 (2认同)

And*_*nin 8

只需使用ansible_ssh_host变量

playbook_example.yml

- hosts: host1
  tasks:
  - name: Show host's ip
    debug:
      msg: "{{ ansible_ssh_host }}"
Run Code Online (Sandbox Code Playgroud)

主机.yml

[hosts]
host1   ansible_host=1.2.3.4
Run Code Online (Sandbox Code Playgroud)

结果

TASK [Show host's ip] *********************************************************************************************************************************************************************************************
ok: [host1] => {
     "msg": "1.2.3.4"
}
Run Code Online (Sandbox Code Playgroud)

  • Ansible 2.0 已弃用“ansible_ssh_host”中的“ssh”。如果 `ansible_host` 包含主机名而不是 IP,则 `ansible_ssh_host` 也可以。 (7认同)

poi*_*ige 6

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

所以在模板中,例如:

{{ lookup('dig', ansible_host) }}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 由于不仅 DNS 名称可以在清单中使用,因此最好添加检查它是否不是 IP
  • 显然,此收据无法按间接主机规范的预期工作(例如使用跳转主机)

但它仍然服务于 99%(形象地说)的用例。


小智 6

查找公共 IP 的另一种方法是使用uri模块:

    - name: Find my public ip
      uri: 
        url: http://ifconfig.me/ip
        return_content: yes
      register: ip_response
Run Code Online (Sandbox Code Playgroud)

您的 IP 将在 ip_response.content


Sim*_*ide 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:
Run Code Online (Sandbox Code Playgroud)

这会将公共 IP 放入变量中ipify_public_ip

  • 对于 AWS,inventory_hostname 将是 IP 地址。 (2认同)