Ansible 进阶 | facts 缓存

Posted 不正经程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible 进阶 | facts 缓存相关的知识,希望对你有一定的参考价值。

前言

好久没有更 Ansible 相关的了,今天带大家使用 Ansible facts 缓存,让 Ansible 提速 5 倍之多!

P.S. 文末有小福利哦~


什么是 Ansible facts

Ansible facts 对于需要根据远程主机的信息作为执行条件操作的场景非常有用。例如,根据远程服务器使用的操作系统版本,可以安装不同版本的软件包。或者也可以显示与每台远程计算机相关的一些信息,例如每台设备上有多少 RAM 可用。

如何获取 Ansible facts

默认情况下,在使用 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 缓存了。

Ansible 进阶 | facts 缓存

设置 facts 缓存

我们可以设置 gather_facts: no 来禁止 Ansible 收集 facts 信息,但是有时候又需要使用 facts 中的内容,这时候可以设置 facts 的缓存。

例如,我们可以在空闲的时候收集 facts,缓存下来,在需要的时候直接读取缓存进行引用。

Ansible 1.8 版本开始,引入了 facts 缓存功能。

Ansible 的配置文件中可以修改 gathering 的值为 smartimplicit 或者 explicit

  • smart 表示默认收集 facts,但 facts 已有的情况下不会收集,即使用缓存 facts

  • implicit 表示默认收集 facts,要禁止收集,必须使用 gather_facts: False

  • explicit 则表示默认不收集,要显式收集,必须使用 gather_facts: Ture

在使用 facts 缓存时(即设置为 smart),Ansible 支持两种 facts 缓存:redis 和 jsonfile。

使用 redis 缓存

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 文件缓存

# 使用 json 文件缓存
fact_caching = jsonfile
fact_caching_connection = /tmp/mycachedir

注意:这个目录需要是一个可读写的目录。

效果测试

随便新建一个剧本,这里我们随便执行一个 command 指令:

---
- hosts: 192.168.9.21
  tasks:
    - nametest ping
      commandwhoami

未使用 facts 缓存的耗时:

Ansible 进阶 | facts 缓存

使用缓存的耗时:

Ansible 进阶 | 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,实验中没有看出来,有高手的话可以留言解答下我的疑惑。


福利 最近搜集到慕课网视频,视频内容涵盖 Python、Java、php、前端、小程序、算法、架构、数据库等等!关注本公众号,后台回复「 慕课网」即可获取下载地址。


推荐阅读







以上是关于Ansible 进阶 | facts 缓存的主要内容,如果未能解决你的问题,请参考以下文章

ansible常用的定义变量方式和变量注册facts缓存和template的使用

Ansible最佳实践之 AWX 启用facts缓存和模板问卷调查

Ansible最佳实践之 AWX 启用facts缓存和模板问卷调查

Ansible自动化运维工具Ansible变量之Facts变量

Ansible 之 ansible gather_facts配置

ansible优化