获取当前通过SSH与ansible连接时使用的公共IP /主机

时间:2017-07-26 15:03:47

标签: networking ssh ansible

我有一个类似于此的ansible host文件(名为my_host_file):

[my_group_name]
MY_PUBLIC_IP_FOR_VM_XYZ

然后我在YAML剧本(称为my_playbook.yml)中尝试了几种不同的方法,类似于:

---
- hosts: my_group_name
  sudo: yes
  tasks:
  - debug: var=hostvars
  - setup:
    register: allfacts
  - debug: var=allfacts
  - debug: var=ansible_default_ipv4.address
  - debug: var=ansible_hostname
  - command: bash -c "dig +short myip.opendns.com @resolver1.opendns.com"
    register: my_public_ip_as_ansible_var

我按照这样的方式运行:ansible-playbook -v -i my_host_file my_playbook.yml

我希望以与运行my_host_file命令相同的方式获取MY_PUBLIC_IP_FOR_VM_XYZ文件(dig运行时中的公共IP地址使用opendns然后将其存储到变量my_public_ip_as_ansible_var中。

毕竟,ansible本身已经使用它来建立SSH会话,所以它可以存储在某个地方。

我找不到这个信息:

    {li>在hostvars中(实际上我在这里可以找到它,但我也可以看到所有其他主机,所以我无法识别来自主机组的当前SSH会话)。
  • allfacts(使用setup: [...])变量(仅限私有网络中的IP地址,有关该VM的许多有用信息,如磁盘大小,网络,操作系统内核版本等)。
  • {li> in ansible_default_ipv4.address(这是私人网络的IP) {li} in ansible_hostname(这是主机名,而不是my_host_file中使用的公共IP)

在来自my_host_file的SSH会话期间,是否有一种更清晰的方式/更安全的方式来获取主机?

2 个答案:

答案 0 :(得分:3)

  • inventory_hostname:您的广告资源中声明的主机名(可以是IP,DNS或逻辑名称)
  • inventory_hostname_short:相同但删除了第一个点后的所有内容
  • ansible_nodename:主机的主机名(指挥官hostname的结果)
  • ansible_hostname:主机的短主机名(命令hostname --short的结果)
  • ansible_fqdn:主机的完整主机名(带域名)(命令hostname --fqdn的结果)
  • ansible_default_ipv4.address:从主机
  • 访问8.8.8.8的IPv4地址
  • ansible_ethX.ipv4.address:主机ethX接口的IPV4地址
  • ansible_ssh_host:用于访问主机的主机名或IP,如果在广告资源中定义,则

示例:

# hosts
[mygroup]
  myremote.foo.bar ansible_ssh_host=my-machine.mydomain.com
  • inventory_hostname:myremote.foo.bar
  • inventory_hostname_short:myremote
  • ansible_nodename:my-host
  • ansible_hostname:my-host
  • ansible_fqdn:my-host.domain.local
  • ansible_default_ipv4.address:1.2.3.4
  • ansible_eth1.ipv4.address:5.6.7.8
  • ansible_ssh_host:my-machine.mydomain.com

答案 1 :(得分:2)

要从库存文件中获取主机别名,您可以使用inventory_hostname变量。

还有ansible_host变量,因为库存别名和实际主机可能不同。