之前写过一个 Python+Ansible 实现 程序执行 adhoc 和 playbook的功能 ,最近在开发运维平台的时候想直接把它拿过来复用,结果在新的环境执行的时候会因为主机没有添加到 know_hosts文件导致卡住,也就是说 Ansible的 constant 配置的 HOST_KEY_CHECKING=False 未生效

两个环境的的ansible版本是不一致的。所以问题出现在ansible或者ansible-core的版本上。

接下来通过试验来验证

Ansible版本说明

在试验之前,我们先对Ansible模块的版本进行说明

1、Ansible 版本 <= 2.9.9 时,只会安装一个模块

ansible                          2.9.9

2、Ansible 版本 >= 3.0.0 and <= 3.4.0 时,安装的时候,依赖 ansible-base 模块

ansible                          3.4.0
ansible-base                     2.10.17

3.4.0 再往上版本就是4.0.0了

3、Ansible 从 4.0.0 版本开始安装的时候,依赖 ansible-core 模块

ansible      4.0.0
ansible-core 2.11.12

具体的Ansible模块的版本列表详见 https://mirrors.aliyun.com/pypi/simple/ansible/

试验用的脚本参考 test_ansible.py

1、这里对4.0.0以下版本版本,选择 2.9.9 和 3.4.0 两个版本为代表,进行试验,是没有问题的。可以证明 <= 3.4.0 版本的都没有问题

2、因为当前项目环境都是 ansible 4.0.0 以上的版本,所以重点验证

验证的方法是: 采用 Ansible 第二位 版本号升位,分别执行上述脚本。

这里需要说明的是:

如果当前版本验证成功的话,验证下一个版本,一定要换一个主机进行验证

1)验证成功的话肯定会在 know_hosts 文件添加对应的记录
2)这个时候即使手动删除 know_hosts 文件中对应的记录,假设下个版本本应该失败,但是也会成功, 应该是本身做了一些缓存(这里暂未研究缓存在哪里)

最终经过测试验证

key的检测是依赖于 ansible-core, 该模板的最高有效版本是 2.11.6, 而从下面获取的版本依赖记录 来看, ansible 4.10.0 最低支持 2.11.7, ansible 4.9.0 支持 2.11.6 到 2.12

版本依赖关系

ansible 4.10.0 requires ansible-core~=2.11.7, but you have ansible-core 2.12.7 which is incompatible.
ansible 4.9.0 requires ansible-core<2.12,>=2.11.6, but you have ansible-core 2.12.0 which is incompatible.
ansible 5.0.1 requires ansible-core<2.13,>=2.12.0, but you have ansible-core 2.11.6 which is incompatible.

所以正常安装之后默认的最高有效版本及依赖是 Ansible 4.9.0 + Ansible-core 2.11.6

根据上面的试验结论,最高有效版本是 Ansible 4.9.0 + Ansible-core 2.11.6, 难道就不能用最新的版本了吗?

当然不是 ~

我们通过ansible的源码分析(源码位置 site-packages/ansible/config/base.py)知道配置了很多的环境变量, ansible 常量 HOST_KEY_CHECKING 对应的envANSIBLE_HOST_KEY_CHECKING,对应的ini配置文件是 defaults section中的 host_key_checking

那么我们就有一种更快速的解决该问题的办法,就是在执行 runner 之前通过os.environ.setdefault 来设置对应的环境变量

os.environ.setdefault('ANSIBLE_HOST_KEY_CHECKING', 'False')

再次验证,没有了要检测 know_hosts 文件的过程,程序顺利执行

如果觉得文章对你有所帮忙,欢迎点赞收藏,或者可以关注个人公众号 全栈运维

之前写过一个Python+Ansible实现执行程序执行 adhoc 和 playbook的功能,最近在开发运维平台的时候想直接把它拿过来复用,结果在新的环境执行的时候会因为主机没有添加到 know_hosts文件导致卡住....
ansible-known_hosts 使用 ansible 在 known_hosts 文件添加或删除主机。 这对于您想要执行某些操作的新机器特别有用,例如将 'git' 模块与 ssh 一起使用。 如果您不准备 known_hosts 文件,ansible 将挂起,因为它正在等待您无法提供的输入。 将known_hosts bash 脚本复制到 ansible playbook 旁边的库文件夹。 然后你可以定义一个这样的任务: - hosts: myhosts user: deploy tasks: - name: Ensure github is in the known_hosts file known_hosts: host=github.com state=present 必需的。 要添加或删除的主机。 还将查找
[root@iZm5e79rtwsq2hm57teyk5Z ansible]# ansible aofeng -f 5 -m ping 192.168.1.106 | FAILED! => { "failed": true, "msg": "Using a SSH password instead of a key is not possible b...
1、ansible的配置文件hosts,如果配置了ssh_user,ssh_pass;但是配置文件ansible.cfg开启host_key_checking 执行命令会失败,报错如下: | FAILED | rc=-1 >> Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please
什么是StrictHostKeyChecking 使用ssh访问时,A通过ssh首次连接到B,B会将公钥1(host key)传递给A,在首次链接时,会弹出交互验证B的公钥1是否正确,如果正确则输入yes确认,A将公钥1存入known_hosts文件,以后A再连接B时,B依然会传递给A一个公钥2,OpenSSH会核对公钥,通过对比公钥1与公钥2 是否相同来进行简单的验证,如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。 但是如果程序自动链接ssh远端机器,就需要由程序自
一、Ansible入门 1、Ansible、Saltstack和Puppet是目前互联网IT使用最最广泛的自动化运维工具,主要是用于自动化管理、配置数以万计的服务器,具体可以对服务器做哪些管理呢? 修改、更新服务器配置文件; 创建目录、文件、删除; 执行各种SHELL命令,不支持交互模式指令; 查看服务器资源、CPU、MEM、DISK; 安装软件服务、启动、停止、重启。 2、Ansi...
转自:https://yq.aliyun.com/articles/288093 The authenticity of host 'IP' can't be established:ssh客户端登录Linux系统出错解决记录 在用ssh客户端第一次登录远程Linux的时候通常会报如下的错误 The authenticity of host 'IP' can't be established. ECDSA key fingerprint is SHA256:+9UZGqPe/Rdaiz9jT
math.floor() & math.trunc()math.floor 和 math.trunc的官方不同版本的介绍如下:math.floor: python2.7: Return the floor of x as a float, the largest integer value less than or equal to x. python3.5: Return t