在以下情况下,不同答案中描述的“ipify_facts”方法应该有效:
- 您的控制主机只有一个接口,或者如果它有多个接口并且用于到达 ipify api_url 的接口与用于到达远程主机的接口相同,-并且-
- 您的控制主机有一个公共 IP(根本没有使用 NAT),或者您的控制主机在 NAT 内部,但远程主机在外部。
如果不满足上述任何一个条件(即,如果您的控制主机有多个接口和/或您的控制主机和远程主机都在 NAT 之后并使用私有地址),那么另一种情况(尽管稍微复杂一些) ) 方法是在 Ansible 中复制以下内容:
$ ip route get 203.0.113.4
203.0.113.4 via 172.26.232.1 dev enp0s3 src 172.26.232.125
cache
$
这将向您显示用于到达特定目的地 (203.0.113.4) 的接口和源地址 (172.26.232.125)。
在 Ansible 中实现这一点的一种方法是:
---
- name: Obtain local IP address
local_action: shell ip route get {{ inventory_hostname }} | awk '{ for (x=1;x<=NF;x++) if ($x=="src") print $(x+1) }'
register: local_address
changed_when: false
- name: Print my local address
debug: msg="Source address towards {{ inventory_hostname }} is {{ local_address.stdout }}"
输出:
$ ansible-playbook test.yml -i inventory.txt
PLAY [test] ********************************************************************
TASK [Obtain local IP address] *************************************************
ok: [203.0.113.4 -> localhost]
TASK [Print my local address] **************************************************
ok: [203.0.113.4] => {
"msg": "Source address towards 203.0.113.4 is 172.26.232.125"
}
如果您有多个可通过不同接口访问的远程主机,这也应该有效。
如果您的inventory_hostname 是DNS 主机名而不是数字IP 地址,则需要在“shell”操作中增加一个步骤。