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

TPP*_*PPZ 0 ssh networking ansible

我有一个与此类似的ansiblehost文件(称为my_host_file):

[my_group_name]
MY_PUBLIC_IP_FOR_VM_XYZ
Run Code Online (Sandbox Code Playgroud)

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

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

我像这样运行一切: ansible-playbook -v -i my_host_file my_playbook.yml

我想在运行时以不同于使用命令然后将其存储到变量中的方式获取my_host_file文件 ( MY_PUBLIC_IP_FOR_VM_XYZ)的公共 IP 地址。digopendnsmy_public_ip_as_ansible_var

毕竟这个已经被ansible自己用来建立SSH会话了,所以可能会存放在某个地方。

我也找不到此信息:

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

是否有更简洁的方式/更可靠的方式来让主机在来自 的 SSH 会话期间使用my_host_file

zig*_*arn 5

  • 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:用于通过 SSH 访问主机的主机名或 IP(如果在清单中定义)

例子 :

# hosts
[mygroup]
  myremote.foo.bar ansible_ssh_host=my-machine.mydomain.com
Run Code Online (Sandbox Code Playgroud)
  • inventory_hostname: myremote.foo.bar
  • inventory_hostname_short: 远程
  • ansible_nodename: 我的主机
  • ansible_hostname: 我的主机
  • 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