【问题标题】:Ansible is connecting to the wrong hosts when using jump host使用跳转主机时,Ansible 连接到错误的主机
【发布时间】:2018-05-17 23:46:26
【问题描述】:

我在两个不同的数据中心管理主机。我通过跳转主机到达托管主机。每个数据中心都有一个专用的跳转主机。我的库存文件如下所示:

$ 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


    【解决方案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

    【讨论】:

    • 好主意!它对我有用,但我不得不从ansible.cfg 中注释掉ssh_args = ...。否则会覆盖上面的配置。
    【解决方案2】:

    问题在于 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 2017-11-02
      • 2017-08-08
      相关资源
      最近更新 更多