我正在使用ansible自动化一些任务。其中一个任务需要我从服务器A通过ssh连接到B,然后再从B连接到C。我无法找到任何方法让ansible实现这一操作。是否有什么建议?
如果您不使用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
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'"