如何通过带有一组私钥的跳转主机在远程主机上执行 Ansible 命令

How to execute Ansible command on remote host through a jump host with set of private keys

我有2个主机。我只能使用另一个作为跳转主机 ssh 进入其中一个。我需要创建一个剧本,使我能够通过跳转主机执行命令。

我试图按照 here 的指示进行操作,但没有成功。我认为有问题,因为它没有说明私钥,我需要使用它们来访问这些主机(这些主机在 Openstack 上)。

我的库存是这样的:

[app_hosts]
app ansible_host=192.168.0.4 ansible_user=ubuntu 
ansible_ssh_private_key_file=app-key.pem 
ansible_python_interpreter=/usr/bin/python3

[db_hosts]
db ansible_host=192.168.0.3 ansible_user=ubuntu 
ansible_ssh_private_key_file=db-key.pem

[db_hosts:vars]
ansible_ssh_common_args='ssh -o ProxyCommand="ssh -W %h:%p 
ubuntu@192.168.0.4 -i app-key.pem" ubuntu@192.168.0.3 -i db-key.pem' 

遗憾的是我得到了:

TASK [Gathering Facts] 
*********************************************************
fatal: [db]: UNREACHABLE! => {"changed": false, "msg": "Failed to 
connect to the host via ssh: channel 0: open failed: connect failed: strong text
Temporary failure in name resolution\r\nstdio forwarding 
failed\r\nssh_exchange_identification: Connection closed by remote 
host\r\n", "unreachable": true}

这可能不是完整的答案,但 'ansible_ssh_common_args' 的定义似乎有些混乱。试试这个,看看它是否让你更进一步:

[db_hosts:vars]
ansible_ssh_common_args='-o ProxyCommand="ssh -i app-key.pem -W %h:%p ubuntu@192.168.0.4"' 

变化:

  • 'ansible_ssh_common_args' 定义要添加到 Ansible 将使用的 ssh 命令的附加参数,因此您不应该在前面 ssh
  • 将 -i 移到 user@host 定义的前面,严格来说 user@host 应该是命令的最后一个组成部分
  • 完全删除了 'ubuntu@192.168.0.3 -i db-key.pem'。这不是必需的,因为在 'ansible_ssh_common_args' 中,您只是定义一个主机以有效地通过隧道连接。因此 Ansible 将尝试连接到数据库主机,但将 'ansible_ssh_common_args' 的内容添加到它构建的 SSH 命令中以启用隧道