我有一个类似于此的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会话,所以它可以存储在某个地方。
我找不到这个信息:
hostvars
中(实际上我在这里可以找到它,但我也可以看到所有其他主机,所以我无法识别来自主机组的当前SSH会话)。
allfacts
(使用setup: [...]
)变量(仅限私有网络中的IP地址,有关该VM的许多有用信息,如磁盘大小,网络,操作系统内核版本等)。ansible_default_ipv4.address
(这是私人网络的IP)
{li} in ansible_hostname
(这是主机名,而不是my_host_file
中使用的公共IP)
在来自my_host_file
的SSH会话期间,是否有一种更清晰的方式/更安全的方式来获取主机?
答案 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
变量,因为库存别名和实际主机可能不同。