在使用Ansible进行自动化部署和配置管理时,可能会遇到 known_hosts
文件相关的错误。这通常发生在Ansible尝试通过SSH连接到远程主机时,SSH客户端检查远程主机的公钥是否已经记录在本地用户的 known_hosts
文件中。如果没有记录或者公钥发生了变化,SSH客户端会拒绝连接并抛出错误。
要解决这个问题,请按照以下步骤操作:
-
关闭StrictHostKeyChecking:
可以通过修改Ansible配置或者直接在命令行中设置环境变量来关闭StrictHostKeyChecking。这将允许Ansible连接到未知的主机而不需要交互式地确认密钥。ansible_ssh_common_args: '-o StrictHostKeyChecking=no'
-
使用ssh-keyscan更新known_hosts:
在运行ansible-playbook之前,可以使用ssh-keyscan工具来扫描目标服务器的SSH密钥,并将其添加到本地用户目录下的.ssh/known_hosts
文件中。ssh-keyscan -H <hostname_or_ip> >> ~/.ssh/known_hosts
-
清理旧密钥:
如果服务器重新安装了操作系统或更换了SSH密钥,则需要从.ssh/known_hosts
文件中删除旧有条目以避免冲突。
ssh-keygen -R <hostname_or_ip>
- 自动处理新键值对:
使用ansible-playbook参数--ssh-extra-args='-o UserKnownHostsFile=/dev/null'
, 这样可以临时忽略掉已知主机文件,在某些临时环境和测试场景下非常有用。 - 管理多个版本系统上不同IP地址对应相同hostname问题:
如果你有多个版本系统(如开发、测试、生产)并且它们共享相同域名但IP地址不同,则可能需要为每一个环境维护一个单独版本控制下得knows_host_file
, 并通过ansible配置指定它们:
[dev]
host1 ansible_host=192.x.x.x
[test]
host1 ansible_host=193.x.x.x
[prod]
host1 ansible_host=194.x.x.xx
[all:vars]
ansible_user=myuser
[dev:vars]
ansible_ssh_common_args='-o UserKnownHostsFile=./env/dev/.knows_host_file'
[test:vars]
ansible_ssh_common_args='-o UserKnownHostsFile=./env/test/.knows_host_file'
[prod:vars]
ansbile_ssh_common_args='-o UserKnowsnHotsFile=./env/prod/.knowsn_hots_file'
- 使用 Ansible 的
add host key module
:
Ansible 提供了一个模块用于自动添加新 SSH 密匙至 known hosts 文件, 这样可以确保每次运行 playbook 前都是最新可信任 SSH 密匙。
- name : Add new host key to the known hosts file.
hosts : all
tasks :
- name : Scan for new ssh host key.
add_hos_key :
name : "{{ inventory_hostname }}"
7 . 定期更新你得 SSH 密匙:
定期更新你得 SSH 密匙是一种好习惯, 可以提高安全性, 同样也要确保 Ansibl 知道最新可信任得 SSH 密匙.
8 . 使用 Ansibl Vault 管理敏感信息:
对于存储敏感信息如密码等, 应该使用 Ansbile Vault 来加密存储.
9 . 监控与审计:
对于所有与 security 相关操作应该进行监控与审计.
10 . 故障排除文档化:
当出现问题解决后应该文档化处理过程及结果供未来参考.
以上步骤提供一种方法论去解决和优化 Ansibl 在处理多 IP 配置过程当中可能遇见关于 known hosts 文件报错问题,并非唯一方法但能够有效减少此类报错影响正常部署流程。