Ansible事实缓存配置全面指南
使用jsonfile或Redis配置Ansible事实缓存,设置超时时间,清除过期缓存数据,避免重复收集事实的开销。
Ansible事实缓存配置全面指南
当你的剧本在每次运行时花费过多时间收集相同的主机事实时,Ansible事实缓存就能派上用场。如果你管理着数百台主机,重复的setup模块调用会在实际工作开始前增加明显的SSH开销。
事实缓存在成功运行后存储收集到的事实,然后在缓存有效期内重复使用它们。对于能够容忍事实稍微过时的工作流,这能加快剧本启动速度。
理解Ansible事实及其性能影响
Ansible通过setup模块收集事实,无论是显式调用还是通过默认的gather_facts: true行为。事实包括操作系统家族、内核、IP地址、挂载点、CPU、内存和Python解释器信息等详细信息。
性能提升来自于在缓存数据新鲜时避免重复的远程收集。这对于报告、模板化和依赖于不会每分钟变化的事实的条件逻辑非常有用。
事实缓存的配置方法
Ansible在ansible.cfg中配置事实缓存。两个实用的选择是本地JSON文件和Redis。确切的插件名称很重要。
1. JSON文件缓存(本地存储)
JSON文件缓存将事实存储在控制机器上。它很简单,不需要外部服务。
在ansible.cfg中配置JSON缓存
使用jsonfile缓存插件:
[defaults]
fact_caching = jsonfile
fact_caching_connection = /path/to/ansible_facts_cache
fact_caching_timeout = 600
fact_caching_connection是Ansible写入缓存文件的目录。先创建它,并确保运行Ansible的用户有写入权限:
mkdir -p /path/to/ansible_facts_cache
fact_caching_timeout以秒为单位。超时后,当剧本需要时,Ansible会再次收集新鲜的事实。
2. Redis缓存(共享、高性能存储)
当多个控制节点、用户或CI作业需要共享相同的事实缓存时,Redis效果更好。
Redis缓存的先决条件
你需要一个可访问的Redis服务器,并且在Ansible使用的Python环境中安装Python Redis客户端:
python -m pip install redis
在ansible.cfg中配置Redis缓存
使用Redis连接字符串:
[defaults]
fact_caching = redis
fact_caching_connection = 127.0.0.1:6379/0
fact_caching_timeout = 3600
/0选择Redis数据库0。如果其他应用程序也使用Redis,请使用专用数据库或Redis实例,并像保护其他基础设施服务一样保护Redis端点。
将缓存集成到剧本中
当剧本收集事实时,缓存会被填充:
- name: 收集并使用事实
hosts: webservers
gather_facts: true
tasks:
- name: 显示操作系统家族
debug:
msg: "操作系统家族是 {{ ansible_os_family }}"
启用事实缓存后,Ansible可以在缓存有效时重复使用它们。如果事实缺失或过期且gather_facts: true,Ansible会再次收集。
如果你设置gather_facts: false,Ansible不会为该剧本运行事实收集。如果事实已经缓存,缓存的事实可能仍然可以通过主机变量获得,但不要盲目依赖它进行关键逻辑。缓存缺失可能导致变量未定义。
一个安全的模式是在定时或早期剧本中收集事实,然后在后续的报告或编排剧本中使用缓存的事实,这些场景下数据过时是可以接受的。
管理事实缓存
当主机事实发生变化且你不想等待超时时,清除缓存。
清除JSON缓存
删除配置的缓存目录中的文件:
rm -rf /path/to/ansible_facts_cache/*
清除Redis缓存
如果Redis数据库专用于Ansible事实,你可以刷新该数据库:
redis-cli -n 0 FLUSHDB
FLUSHDB会删除所选Redis数据库中的所有键。不要在共享数据库上运行它,除非你知道那里的每个键都可以安全删除。
最佳实践
- 对于单个控制机器和简单的本地工作流,使用
jsonfile。 - 当多个运行器需要相同的缓存时,使用Redis。
- 对于快速变化的基础设施,保持较短的超时时间;对于稳定的集群,使用较长的超时时间。
- 不要将敏感的定制事实缓存在其他用户可以读取的位置。
- 使用
ansible --version验证Ansible正在使用的配置文件。 - 在启用跨大型集群的缓存之前,先使用一个清单组进行测试。
实用要点
当重复的事实收集是一个可衡量的成本,并且你的剧本可以容忍缓存数据时,启用Ansible事实缓存。从jsonfile开始,仅在共享缓存解决实际工作流问题时才迁移到Redis,并设置与主机事实变化频率相匹配的超时时间。