1. 概述
在使用 Ansible 时,SSH 主机密钥验证机制有时会干扰自动化流程。例如在测试环境或云基础设施中,我们可能并不关心每次连接的主机是否可信。因为这类环境中实例经常被创建和销毁,此时跳过 SSH 密钥验证可以提升效率,虽然这只是临时性的妥协方案。
Ansible 在首次连接远程主机时会提示用户确认主机指纹。这是为了防止连接到恶意或伪造的服务器,避免中间人攻击(MITM)。但在自动化测试或频繁重建的环境中,这种交互式提示会成为阻碍。
本文将介绍在 Ansible 中安全地禁用 SSH 主机密钥验证的多种方式,并辅以示例说明。
2. Ansible 中禁用 SSH 主机密钥验证的几种方式
Ansible 提供了以下几种方式来跳过 SSH 主机密钥验证:
✅ 优点:可根据实际需求选择全局或局部禁用
❌ 缺点:降低安全性,仅建议用于测试环境
方法 | 说明 |
---|---|
修改 ansible.cfg |
全局或项目级配置,适用于所有主机 |
修改 inventory 文件 | 为特定主机配置 SSH 参数 |
Playbook 中设置 vars |
仅对当前 Playbook 生效 |
命令行参数 | 一次性执行时使用,不影响配置文件 |
设置环境变量 | 当前会话生效,可影响多个 Ansible 命令 |
修改 SSH 配置文件 | 更底层控制,适用于非 Ansible 场景 |
3. 搭建测试环境
在开始之前,我们先搭建一个简单的测试环境:
- 控制节点(Controller)为一台安装了 Ansible 的虚拟机
- 若干客户端(Client)主机,可通过 SSH 访问
- SSH 用户已配置好密钥认证或密码认证
- 所有主机的 SSH 公钥已写入
~/.ssh/known_hosts
确认以下命令可以正常运行:
ansible all -m ping -i inventory.ini
4. 通过 ansible.cfg
禁用
Ansible 的配置文件 ansible.cfg
可用于全局或项目级配置:
- 项目级:放在 playbook 同级目录下
- 全局级:通常位于
/etc/ansible/ansible.cfg
在配置文件中添加:
[defaults]
host_key_checking = False
保存后测试:
ansible all -m ping -i inventory.ini
⚠️ 此方式影响所有主机,需谨慎使用。
5. 通过 Inventory 文件禁用
若只想为特定主机禁用 SSH 密钥验证,可在 inventory 文件中指定:
[client3]
192.168.29.23 ansible_ssh_common_args='-o StrictHostKeyChecking=no'
测试命令:
ansible all -m ping -i inventory.ini
✅ 优点:粒度更细,只影响指定主机
❌ 缺点:维护多个 inventory 文件可能复杂
6. 在 Playbook 中禁用
Playbook 中也可以通过 vars
来禁用 SSH 主机密钥验证:
- hosts: client1
vars:
ansible_ssh_common_args: '-o StrictHostKeyChecking=no'
tasks:
- name: Ping the server
ansible.builtin.ping:
运行:
ansible-playbook -i inventory.ini ping.yml
✅ 优点:仅影响当前 Playbook,适合临时调试
❌ 缺点:不够灵活,每次都要修改 Playbook
7. 使用命令行参数临时禁用
不想修改配置文件?可以用命令行参数临时跳过:
ansible-playbook ping.yml -i inventory.ini --ssh-extra-args="-o StrictHostKeyChecking=no"
或者使用 ad-hoc 命令:
ansible all -m ping -e "ansible_ssh_common_args='-o StrictHostKeyChecking=no'" -i inventory.ini
✅ 优点:快速、不影响配置文件
❌ 缺点:只能临时使用一次
8. 设置环境变量禁用
也可以通过环境变量全局禁用:
export ANSIBLE_HOST_KEY_CHECKING=False
如需永久生效,可写入 ~/.bashrc
或 ~/.profile
:
echo 'export ANSIBLE_HOST_KEY_CHECKING=False' >> ~/.bashrc
source ~/.bashrc
测试:
ansible all -m ping -i inventory.ini
✅ 优点:灵活且作用范围可控
❌ 缺点:仅对当前 shell 会话生效
9. 修改 SSH 配置文件
还可以通过修改 SSH 客户端配置来跳过验证:
cat ~/.ssh/config
Host 192.168.29.23
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
测试:
ansible all -m ping -i inventory.ini
✅ 优点:适用于多个 Ansible 配置
❌ 缺点:需手动维护 ~/.ssh/config
10. 总结
方法 | 是否全局 | 是否灵活 | 适用场景 |
---|---|---|---|
ansible.cfg |
✅ | ❌ | 所有主机测试环境 |
Inventory 文件 | ❌ | ✅ | 特定主机 |
Playbook 中 vars |
❌ | ✅ | 单个 Playbook |
命令行参数 | ❌ | ✅ | 临时调试 |
环境变量 | ✅ | ✅ | 当前会话 |
SSH 配置文件 | ✅ | ✅ | 多 Ansible 配置 |
⚠️ 安全提醒:跳过 SSH 主机密钥验证会带来中间人攻击的风险,务必仅在非生产环境或受控网络中使用。在生产环境中,应始终启用 SSH 密钥验证以确保连接安全。