如何在Ansible中通过Jumpbox先切换Root再登录远程服务器?
通过Ansible实现经堡垒机切换Root后访问远程服务器
你之前的ProxyCommand配置直接用普通用户走堡垒机,但没法在堡垒机上切换Root再连接远程服务器。要匹配手动操作的流程,需要调整ProxyCommand的逻辑,让它在堡垒机上先切换到Root身份,再发起对远程服务器的连接。
核心配置方案
在远程服务器的Ansible变量配置(如host_vars/[远程服务器名].yml或group_vars/[组名].yml)中,修改ansible_ssh_common_args:
ansible_ssh_common_args: '-o ProxyCommand="ssh -q user@jumpbox su - root -c '\''ssh -W %h:%p root@%h'\''"'
配置说明
ssh -q user@jumpbox:以普通用户user静默登录堡垒机su - root -c '...':切换到Root用户,并执行后续的ssh通道转发命令ssh -W %h:%p root@%h:以Root身份从堡垒机建立到远程服务器的标准输入输出通道(-W参数实现代理转发)
密码处理(两种方式)
方式1:免密登录(推荐)
为避免手动输入密码,建议配置两层免密:
- 本地机器生成密钥对,将公钥添加到堡垒机
user用户的~/.ssh/authorized_keys,实现本地免密登录堡垒机普通用户 - 在堡垒机上以Root身份生成密钥对,将公钥添加到远程服务器Root用户的
~/.ssh/authorized_keys,实现堡垒机Root免密登录远程服务器 - (可选)配置堡垒机
user免密su到Root:修改/etc/pam.d/su或在sudoers中添加对应规则
方式2:明文密码(仅测试用,不推荐)
如果必须使用密码,可借助sshpass自动输入,配置如下:
ansible_ssh_common_args: '-o ProxyCommand="sshpass -p [堡垒机Root密码] ssh -q user@jumpbox su - root -c '\''sshpass -p [远程服务器Root密码] ssh -W %h:%p root@%h'\''"'
替代方案:用sudo代替su
如果堡垒机禁止直接su到Root,但允许普通用户使用sudo,可将配置改为:
ansible_ssh_common_args: '-o ProxyCommand="ssh -q user@jumpbox sudo -i ssh -W %h:%p root@%h"'
同时需在堡垒机的sudoers文件中添加规则,允许user免密执行ssh:
user ALL=(ALL) NOPASSWD: /usr/bin/ssh
测试验证
执行以下命令测试连接是否正常:
ansible [远程服务器名] -m ping
内容的提问来源于stack exchange,提问作者Muneeb K
相关产品推荐
相关产品推荐

