134

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

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

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

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

4

10 回答 10

157

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

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

于 2016-10-02T23:01:40.813 回答
86

您可以从hostvars、 dictansible_default_ipv4和 key获取 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']
于 2016-10-02T17:48:10.177 回答
28

您可以在 template.j2{{ ansible_eth0.ipv4.address }}中使用与使用{{inventory_hostname}}.

ps:请参阅以下博文以了解有关如何使用 ANSIBLE GATHERS FACTS 收集有关远程主机 的信息的更多信息。

'希望有一天它会帮助某人 t</p>

于 2017-01-25T13:50:22.237 回答
15

只需使用ansible_ssh_host变量

playbook_example.yml

- hosts: host1
  tasks:
  - name: Show host's ip
    debug:
      msg: "{{ ansible_ssh_host }}"

主机.yml

[hosts]
host1   ansible_host=1.2.3.4

结果

TASK [Show host's ip] *********************************************************************************************************************************************************************************************
ok: [host1] => {
     "msg": "1.2.3.4"
}
于 2020-06-09T08:28:23.747 回答
11

简单的调试命令:

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"
}
于 2020-01-16T09:52:14.557 回答
7

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

    - name: Find my public ip
      uri: 
        url: http://ifconfig.me/ip
        return_content: yes
      register: ip_response

您的 IP 将在ip_response.content

于 2019-01-11T07:30:54.297 回答
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中。

于 2017-04-22T06:03:07.710 回答
4

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

所以在模板中,例如:

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

笔记:

  • 由于不仅可以在清单中使用 DNS 名称,因此最好添加检查它是否不是 IP
  • 显然,这张收据对于间接主机规范(例如使用跳转主机)不能正常工作

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

于 2018-04-20T16:16:30.470 回答
2

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

ansible_default_ipv4.address|default(ansible_all_ipv4_addresses[0])
于 2019-12-16T07:22:30.490 回答
1

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

于 2018-11-22T07:09:59.187 回答