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 密钥验证以确保连接安全。


原始标题:Ignoring Ansible SSH Authenticity Check