Ansible 进阶 | facts 缓存
Posted 不正经程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible 进阶 | facts 缓存相关的知识,希望对你有一定的参考价值。
好久没有更 Ansible 相关的了,今天带大家使用 Ansible facts 缓存,让 Ansible 提速 5 倍之多!
P.S. 文末有小福利哦~
Ansible facts 对于需要根据远程主机的信息作为执行条件操作的场景非常有用。例如,根据远程服务器使用的操作系统版本,可以安装不同版本的软件包。或者也可以显示与每台远程计算机相关的一些信息,例如每台设备上有多少 RAM 可用。
默认情况下,在使用 Ansible 对远程主机执行任何一个 playbook 之前,总会先通过 setup 模块获取 facts,并暂存在内存中,直至该 playbook 执行结束。
这意味着,想要在 playbook 中引用主机变量,至少先与该主机通信一次,以便 Ansible 能够访问其 facts,尽管有时候只需要来自该主机的少量信息。
Ansible 提供了 setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用。
如果想查看 setup 模块获取到的数据,可以在命令行上通过调用 setup 模块命令查看:
ansible all -m setup
将会返回一大大堆数据,文章篇幅有限,这里就不再展示。
获取这么多数据是非常耗时的,通过 time
指令可以看出,获取一台主机的 facts 数据就用了 3 秒多时间:
time ansible localhost -m setup
real 0m3.321s
user 0m1.797s
sys 0m0.205s
在被控主机较少的情况下,收集信息还可以容忍,如果被控主机数量非常大,收集 facts 信息会消耗掉非常多时间。
那怎么办呢?优化 Ansible 运行速度,最简单的莫过于设置 facts 缓存了。
我们可以设置 gather_facts: no
来禁止 Ansible 收集 facts 信息,但是有时候又需要使用 facts 中的内容,这时候可以设置 facts 的缓存。
例如,我们可以在空闲的时候收集 facts,缓存下来,在需要的时候直接读取缓存进行引用。
Ansible 1.8 版本开始,引入了 facts 缓存功能。
Ansible 的配置文件中可以修改 gathering 的值为 smart
、implicit
或者 explicit
。
smart 表示默认收集 facts,但 facts 已有的情况下不会收集,即使用缓存 facts
implicit 表示默认收集 facts,要禁止收集,必须使用
gather_facts: False
explicit 则表示默认不收集,要显式收集,必须使用
gather_facts: Ture
在使用 facts 缓存时(即设置为 smart),Ansible 支持两种 facts 缓存:redis 和 jsonfile。
gathering = smart
fact_caching_timeout = 86400
fact_caching = redis
fact_caching_connection = 127.0.0.1:6379
# 若 redis 设置了密码
# fact_caching_connection = localhost:6379:0:admin
在使用 redis 缓存后,出现异常(若未出现,请忽略):TypeError: the JSON object must be str, not 'bytes'
,加上 -vvv
打印出调试信息后,定位到 /usr/local/lib/python3.5/dist-packages/ansible-2.5.0-py3.5.egg/ansible/plugins/cache/redis.py 文件中的 第 90 行:
self._cache[key] = json.loads(value)
将其修改为如下即可:
self._cache[key] = json.loads(value.decode('utf-8'))
# 使用 json 文件缓存
fact_caching = jsonfile
fact_caching_connection = /tmp/mycachedir
注意:这个目录需要是一个可读写的目录。
随便新建一个剧本,这里我们随便执行一个 command 指令:
---
- hosts: 192.168.9.21
tasks:
- name: test ping
command: whoami
未使用 facts 缓存的耗时:
使用缓存的耗时:
可以发现,速度提升很多,由 15s 减少到只有 3s!
运行结束后,在 redis 中可以看到有如下数据:
$ redis-cli
127.0.0.1:6379> keys *
1) "ansible_facts10.254.9.21"
2) "ansible_cache_keys"
若使用的是 json 缓存,配置的目录中会生成如下文件:
$ tree facts_cache/
facts_cache/
└── 10.254.9.21
0 directories, 1 file
其中存放的就是主机的 facts 信息。
不同网络环境下的耗时肯定是不同的,但是设置缓存是肯定可以加快 Ansible 运行速度的,特别是 playbook 的运行。
另外,可以在空闲时间手动进行 facts 缓存的更新,从而避免执行真正的任务时再去更新缓存。
当然,优化 Ansible 运行速度还有其他方法,后面我再继续给大家分享。另外,Ansible Ad-hoc 运行时是否会默认调用 setup 模块采集 facts,实验中没有看出来,有高手的话可以留言解答下我的疑惑。
以上是关于Ansible 进阶 | facts 缓存的主要内容,如果未能解决你的问题,请参考以下文章
ansible常用的定义变量方式和变量注册facts缓存和template的使用
Ansible最佳实践之 AWX 启用facts缓存和模板问卷调查
Ansible最佳实践之 AWX 启用facts缓存和模板问卷调查
Ansible自动化运维工具Ansible变量之Facts变量