Ansible通过跳板机连目标主机用跳板机私钥的配置及报错解决
错误原因
- 引号嵌套混乱:inventory配置中
ansible_ssh_common_args的多层单双引号嵌套被ansible错误转义,最终执行的ssh命令参数畸形,导致跳板机主动断开连接 - 逻辑不符合需求:你配置的
ForwardAgent是将本地A的ssh代理转发到跳板机B,需要本地持有目标主机C的私钥,完全违背你「C的私钥仅存储在B」的核心要求;同时非交互式ssh场景下B默认不会启动ssh-agent,直接执行ssh-add必然失败 - 参数冲突:同时在组变量和主机行重复定义ssh端口参数,旧版ansible存在优先级解析冲突
正确配置方案
直接修改inventory.ini为以下内容,替换尖括号占位符为实际值即可:
[deployment_host:vars] # 目标主机C的登录用户名 ansible_user = <目标主机C的登录用户名> # 目标主机C的ssh端口 ansible_port = 22 # 本地A连接跳板机B的私钥路径 ansible_ssh_private_key_file = <本地A上存放的连接B的私钥绝对路径> # 核心代理配置,无多余转义 ansible_ssh_common_args='-o StrictHostKeyChecking=no -o ProxyCommand="ssh -o StrictHostKeyChecking=no -p 2222 <跳板机B的登录用户名>@<跳板机B的公网IP> ssh -o StrictHostKeyChecking=no -i /home/<跳板机B的登录用户名>/.ssh/id_rsa -W %h:%p"' [deployment_host] 10.200.120.218
前置检查项
配置前先确保以下条件满足,避免额外报错:
- 跳板机B上存放的C的私钥
/home/<B的用户名>/.ssh/id_rsa权限为600,所属用户为B的登录用户 - 跳板机B上该私钥的公钥已经添加到目标C的
~/.ssh/authorized_keys文件中,在B上手动执行ssh -i ~/.ssh/id_rsa <C的用户名>@10.200.120.218 hostname可正常返回结果 - 本地A上存放的连接B的私钥权限为
600,公钥已添加到B的~/.ssh/authorized_keys文件中
验证方法
先在本地A手动执行ssh命令验证链路连通性,替换占位符后执行:
ssh -o StrictHostKeyChecking=no -o ProxyCommand="ssh -o StrictHostKeyChecking=no -p 2222 <B的用户名>@<B的公网IP> ssh -o StrictHostKeyChecking=no -i /home/<B的用户名>/.ssh/id_rsa -W 10.200.120.218:22" <C的用户名>@10.200.120.218 hostname
命令正常返回C的主机名后,再执行你原来的ansible命令即可正常运行。
内容的提问来源于stack exchange,提问作者Sharath Prakash
相关产品推荐
相关产品推荐

