Ansible在使用跳转主机时连接到错误的主机

Ansible在使用跳转主机时连接到错误的主机,ansible,Ansible,我在两个不同的数据中心管理主机。我通过跳转主机访问托管主机。每个数据中心都有一个专用的跳转主机。我的库存文件看起来像: $ cat inventory-dc1 [all:vars] ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p -q ubuntu@10.1.1.1"' [docker] docker-1 ansible_host=192.168.1.1 docker-2 ansible_host=192.168.1.2 $ ca

我在两个不同的数据中心管理主机。我通过跳转主机访问托管主机。每个数据中心都有一个专用的跳转主机。我的库存文件看起来像:

$ cat inventory-dc1
[all:vars]
ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p -q ubuntu@10.1.1.1"'

[docker]
docker-1 ansible_host=192.168.1.1
docker-2 ansible_host=192.168.1.2

$ cat inventory-dc2
[all:vars]
ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p -q ubuntu@10.1.1.2"'

[docker]
docker-1 ansible_host=192.168.1.1
docker-2 ansible_host=192.168.1.2
当我使用
inventory-dc1
运行剧本时,一切都按预期运行


当我随后使用
inventory-dc2
运行剧本时,问题就会显现出来。Ansible从
inventory-dc1
而不是
inventory-dc2
连接到主机。我知道托管主机具有相同的IP地址,但它们是通过不同的跳转主机访问的。

问题是Ansible自动启用SSH多路复用。这意味着Ansible建立的ssh连接如下所示:

CP=~/.ansible/cp/ansible-ssh-%h-%p-%r
ssh -o ControlMaster=auto -o ControlPersist=60s -o ControlPath=$CP \
ubuntu@192.168.1.1 /bin/true
这将创建一个套接字,如
~/.ansible/cp/ansible-ssh-192.168.1.1-22-ubuntu
,并将其打开60秒。如果在60秒内使用相同的IP地址、端口和用户名运行另一个ssh连接,您将连接到同一主机

对我有效的解决方案是为Ansible禁用SSH多路复用:

$ cat ansible.cfg
[ssh_connection]
ssh_args = -o ControlMaster=no
这不是一个最优的解决方案,因为它会减慢速度

另一个(次优:-)解决方案是手动卸下插座:


为每个库存创建唯一的控制路径:

[all:vars]
ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p -q ubuntu@10.1.1.1" -o ControlMaster=auto -o ControlPersist=60s -o ControlPath=~/.ansible/cp/dc1-ssh-%C'

注意路径的前缀
dc1
。为第二个库存指定
dc2

好主意!它对我有用,但我不得不从
ansible.cfg
中注释掉
ssh\u args=…
。否则将覆盖上述配置。
[all:vars]
ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p -q ubuntu@10.1.1.1" -o ControlMaster=auto -o ControlPersist=60s -o ControlPath=~/.ansible/cp/dc1-ssh-%C'