我想将 ansible_default_ipv4 更改为指向 eth1 而不是 eth0。我可以在剧本中或通过 --extra-vars 选项执行此操作吗?
3 回答
ansible 使用命令 ip -4 route get 8.8.8.8
获取默认的 ipv4 接口。您可以更改您的 ip/路由表以创建eth1
默认路由,它会返回它。
或者您可以使用 自定义事实。
PS:set_fact
用于覆盖ansible_default_ipv4
事实,但由于缓存,范围,......
另一种选择是始终明确引用您的界面。不同的云提供商有不同的约定将私有(通常是 10.xyz)管理网络放在 eth0 或 eth1 上。
而不是参考
ansible_default_ipv4["address"]
您始终可以定义所需的 iface(例如在 group_vars/all 中)
脸:eth0
并在任务中将其引用为
{{ 'ansible_'+iface['ipv4']['address'] }}
一个简单的 grep 将显示所有引用。对您的项目进行全局查找和替换将让您改变这一点。
grep -RH ansible_default_ipv4 .
然后,当您想要切换云提供商时,您只需根据需要调整 iface。
如果您更喜欢不那么冗长,更明确的定义
private_iface: eth0 #switch eth0,eth1 depending on your provider.
public_iface: eth1
private_host_ipv4: "{{ 'ansible_'+private_iface['ipv4']['address'] }}"
public_host_ipv4: "{{ 'ansible_'+public_iface['ipv4']['address'] }}"
并且只使用
ansible_default_ipv4
当您想引用用于访问 8.8.8.8(一般互联网)的私有或公共 IP 时。
顺便说一句,我尝试了 Eron Wright 对 route add -net 8.8.8.8 netmask 255.255.255.255 eth1 的建议。它似乎对我不起作用,我无法 ping 谷歌(尽管 ping 任何其他公共 IP 都有效)。
ip -4 route get 8.8.8.8
没有在我的服务器上工作。
我创造了这个工作。
- name: find default ipv4... this is a bit of a hack.
shell: ifconfig $(route | grep default | awk '{print $(NF)}') | grep 'inet' | awk '{ print $2}'
register: ipv4_address
现在我可以ipv4_address
在任何需要的地方使用!