使用Ansible远程连接服务器的SSH

21

我正在使用ansible自动化一些任务。其中一个任务需要我从服务器A通过ssh连接到B,然后再从B连接到C。我无法找到任何方法让ansible实现这一操作。是否有什么建议?


你是否已经阅读了有关Ansible如何处理堡垒机/跳板主机的文章?如果是,你尝试过使用它吗? - Mxx
谢谢!我不知道这个。现在我已经全部设置好了。 - K G
2
请考虑回答自己的问题,以便其他用户参考 :) - magnetik
2
是的,请发布一个答案,说明您能够设置什么,以便其他人可以从中学习。 - Mxx
你找到解决方案了吗? - Robert
2个回答

17

如果您不使用Paramiko进行ssh连接(transport = ssh),那么Ansible将完全使用您的~/.ssh/config。因此,您可以在ssh配置文件中全局定义所有连接规则。

如果由于某种原因您希望Ansible不使用默认的ssh配置,而是提供单独的配置,您可以在ansible.cfg中定义:

[ssh_connection]
ssh_args= -F "/path/to/ssh/config/specifically/for/ansible"

在您的ssh配置中设置连接规则。按照您的示例进行操作:

Host HostA
  HostName real-host-name-A.com

Host HostB
  HostName real-host-name-B.com
  ProxyCommand ssh -q HostA nc %h %p

Host HostC
  HostName real-host-name-C.com
  ProxyCommand ssh -q HostB nc %h %p
  • 与A的连接是直接的
  • 与B的连接需要通过A
  • 与C的连接需要通过B,再通过A

5
对于Ansible2.0及以上版本,你可以进行以下操作:
步骤#1:编辑hosts文件并添加一个目标主机的行:
my-target-host ansible_host=10.10.105.23 ansible_ssh_private_key_file=~/.ssh/private_key  ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p -q my-jump-node"'

请注意使用ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p -q my-jump-node"',用于通过跳板节点进行代理。

步骤2:在~/.ssh/config文件中定义您的my-jump-node

Host my-jump-node
  Hostname <IP_ADDRESS>
  User ubuntu
  Port 22
  IdentityFile /root/.ssh/nhc-moho/id_rsa # <<< Local path of private key
  ControlMaster auto
  ControlPath /tmp/ansible-%r@%h:%p
  ControlPersist 5m

第三步:注意在上面的第一步中我们有ansible_ssh_private_key_file=~/.ssh/private_key。这是存储在my-jump-node机器上的私钥,其对应的公钥存储在my-target-host上。

要记住的重要事情是:

你必须将此私钥从my-jump-node机器复制到你运行Ansible的本地机器,否则它将无法连接到my-target-host

第四步:测试它。

ansible my-target-host -m shell -a "echo 'TESTING'"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接