我在两个不同的数据中心管理主机。我通过跳转主机访问托管主机。每个数据中心都有一个专用的跳转主机。我的清单文件类似于:
$ 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地址,但它们是通过不同的跳转主机访问的。
发布于 2018-05-17 23:46:26
为每个库存设置唯一的控制路径:
[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。
发布于 2018-05-17 23:12:35
问题是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这不是一个最优的解决方案,因为它会降低Ansible的速度。
另一种(次优:-)解决方案是手动移除插座:
rm ~/.ansible/cp/ansible-ssh-192.168.1.1-22-ubuntuhttps://stackoverflow.com/questions/50394912
复制相似问题