Ansible清单不直接定义代理连接,但可通过连接变量与SSH配置实现跳转:在INI清单中用ansible_ssh_common_args指定ProxyJump,或通过~/.ssh/config统一管理;YAML清单支持嵌套参数;需手动验证SSH跳转及Ansible -vvv输出确认参数注入。

Ansible 清单本身不直接定义“代理连接”逻辑,但可以通过组合 连接变量 与 SSH 配置机制 实现跳转(Bastion/Jump Host)等复杂网络路径。关键在于:清单负责声明“目标是谁、如何连”,而真实代理行为由底层 SSH 层(如 ProxyCommand)或 Ansible 的连接参数驱动。
在清单中声明跳转主机(Bastion)
将跳转主机作为独立组或变量注入目标主机,是最清晰的做法:
- 在 INI 格式清单中为某台主机显式指定
ansible_ssh_common_args:
[webservers]
web01 ansible_host=10.20.30.40 ansible_user=ubuntu
[jump]
bastion ansible_host=203.0.113.5 ansible_user=admin
再通过 host_vars 或内联变量补充连接参数:
[webservers:vars]
ansible_ssh_common_args="-o ProxyJump=bastion"
注意:ProxyJump 是 OpenSSH 7.3+ 原生支持的语法,简洁可靠;若用旧版 SSH,可改用 ProxyCommand ssh -W %h:%p bastion。
使用 SSH Config 文件统一管理代理路径
Ansible 默认尊重系统级 ~/.ssh/config(或 /etc/ssh/ssh_config)。推荐将跳转逻辑集中在此处,清单保持干净:
# ~/.ssh/config
Host bastion
HostName 203.0.113.5
User admin
IdentityFile ~/.ssh/bastion_key
Host web01
HostName 10.20.30.40
User ubuntu
ProxyJump bastion
IdentityFile ~/.ssh/web_key
此时清单只需写:
[webservers]
web01
Ansible 会自动按 SSH 配置解析完整连接链路。
对不同主机使用不同代理策略
当环境混合直连与多级跳转时,避免全局变量污染,应按主机或主机组精细化控制:
- 用
host_vars/web01.yml单独设置:
ansible_ssh_common_args: "-o ProxyCommand='ssh -W %h:%p jump1' -o ProxyCommand='ssh -W %h:%p jump2'"
- 或用 YAML 格式清单直接嵌入(更直观):
all:
children:
webservers:
hosts:
web01:
ansible_host: 10.20.30.40
ansible_user: ubuntu
ansible_ssh_common_args: "-o ProxyJump=jump1"
YAML 清单天然支持嵌套结构和变量覆盖,适合表达复杂拓扑。
验证代理连接是否生效
别跳过这步——很多失败源于 SSH 层未通,而非 Ansible 配置错误:
- 先手动测试 SSH 跳转:
ssh -F ~/.ssh/config web01 - 再运行 Ansible 连通性检测,加
-vvv查看实际执行的 SSH 命令:
ansible web01 -i inventory.yml -m ping -vvv
输出中会显示类似 SSH: EXEC ssh -C -o ControlMaster=auto ... -o ProxyJump=bastion ... 的完整命令,确认参数已正确注入。











