如何在Ansible Playbook中忽略SSH主机密钥检查?
解决Ansible Playbook SSH主机密钥检查失效的问题
如果你试过常规的三种方法(命令行参数、环境变量、ansible.cfg配置)都没生效,大概率是配置加载优先级、语法细节或者外部SSH配置干扰导致的,以下是针对性的排查和解决步骤:
一、先确认现有配置是否真的被加载
- 检查ansible.cfg的实际加载路径:执行
ansible --version,输出里会显示ansible config file的具体路径,确保你修改的是这个路径下的配置文件,而非其他位置的无效文件。 - 验证环境变量生效情况:执行
echo $ANSIBLE_HOST_KEY_CHECKING,如果输出不是False,说明环境变量未正确设置——要么是export后未重新加载shell(比如新开终端),要么是拼写错误(变量名是全大写的ANSIBLE_HOST_KEY_CHECKING)。 - 命令行参数的引号问题:如果使用zsh等非bash shell,单引号可能导致参数解析异常,换成双引号试试:
ansible-playbook play.yml --ssh-common-args="-o StrictHostKeyChecking=no"
二、强制覆盖的生效方案
1. 在Playbook内直接指定SSH参数
绕过外部配置,直接在play里定义变量,优先级最高:
- hosts: your_target_hosts vars: ansible_ssh_common_args: '-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' tasks: # 你的任务内容
加上UserKnownHostsFile=/dev/null可以彻底跳过本地known_hosts文件的检查,避免旧密钥残留导致的问题。
2. 排查系统/用户级SSH配置干扰
如果控制机或目标主机的~/.ssh/config、/etc/ssh/ssh_config里有StrictHostKeyChecking yes的全局配置,会直接覆盖Ansible的参数。可以临时在命令行追加参数强制覆盖:
ansible-playbook play.yml --ssh-common-args="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o GlobalKnownHostsFile=/dev/null"
3. 检查Ansible版本兼容性
Ansible 2.9及更早版本对部分SSH参数的解析存在bug,执行ansible --version查看版本,如果是旧版本,建议升级到2.10+的稳定版,很多配置兼容性问题在新版本里已经修复。
三、快速验证方案
写一个极简测试playbooktest_ssh.yml:
- hosts: your_target_hosts gather_facts: no tasks: - name: Test SSH connection command: echo "Connection success"
用强制参数执行:
ansible-playbook test_ssh.yml --ssh-common-args="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
如果这次能正常执行不弹出密钥确认,说明之前的问题是配置加载或干扰导致的,再针对性调整即可。
内容的提问来源于stack exchange,提问作者code.coderpy
相关产品推荐
相关产品推荐

