我在两个不同的数据中心管理主机。我通过跳转主机访问托管主机。每个数据中心都有一个专用的跳转主机。我的库存文件类似于:
$ 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地址,但可以通过不同的跳转主机访问它们。
答案 0 :(得分:1)
为每个广告资源制作唯一的控制路径:
[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
。
答案 1 :(得分:0)
问题是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-ubuntu