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

时间:2018-05-17 15:12:35

标签: 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

$ 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地址,但可以通过不同的跳转主机访问它们。

2 个答案:

答案 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