在Ansible中缓存事实了解更多关于Ansible自动化相关知识

Ansible剧本运行中的第一步(除非您显式禁用它)是 通过模块收集事实setup。这些事实是在每台计算机上收集的,并在销毁剧本之前将其保存在内存中。这意味着,想要引用来自其他计算机的主机变量的任务将必须在剧本中与该计算机至少对话一次,以使Ansible能够访问其事实,这有时又意味着与主机对话,尽管我们只需要该主机的少量信息即可。

Ansible 1.8版的一个有趣的功能称为“事实缓存”。它允许我们为所有与Ansible对话的主持人建立所有事实的缓存。该缓存将使用运行setup模块(即 gather_facts)的主机的所有事实进行填充。缓存条目的可选到期时间以及启用缓存本身是由以下设置控制的ansible.cfg:

fact_caching = redis
fact_caching_timeout = 3600
fact_caching_connection = localhost:6379:0

默认情况下,fact_caching设置为memory。如上所述配置它,使Ansible使用Redis 实例(在本地计算机上)作为其缓存。超时指定单个Redis密钥(即,基于每台计算机的事实)何时到期。将此值设置为0可以有效地禁用到期,并且正值是TTL(以秒为单位)。

以下小型实验将在246台计算机上运行。了解更多关于Ansible自动化相关知识

---
- hosts:
  - mygroup
  gather_facts: True
  tasks:
  - action: debug msg="memfree = {{ ansible_memfree_mb }}"
PLAY [mygroup] *****************************************************************

GATHERING FACTS ***************************************************************
ok: [www01]
...
TASK: [debug msg="memfree = {{ ansible_memfree_mb }}"] ************************
ok: [www01] => {
    "msg": "memfree = 7811"
}
...

运行我的示例剧本可收集每次运行中的所有事实。这本剧本只花了超过一分钟的时间(1m11)。那么,运行之后,Redis中有什么?

127.0.0.1:6379> keys *
1) "ansible_cache_keys"
2) "JPM"
3) "ansible_factswww01"
...

Redis中的每个键都包含一个JSON字符串值– Ansible收集的所有事实的列表。我们来看一下:了解更多关于Ansible自动化相关知识

#!/usr/bin/env python

import redis
import json

r = redis.StrictRedis(host='localhost', port=6379, db=0)
key = "ansible_facts" + "www01"
val = r.get(key)

data = json.loads(val)
print data['ansible_memfree_mb']  # => 7811

如果我配置gather_facts = False,setup则不会在剧本中调用该模块,而Ansible将访问缓存以获取事实。当然,请注意,每个事实变量的值都将是先前缓存的值。同样,由于事实收集并未发生,因此剧本的运行速度要快一些(根据设置要完成的任务,这可以忽略不计)。在这种情况下,播放时间不到一分钟(0m50)-稍有加快。

在撰写本文时,还存在第二种缓存机制:称为jsonfile,它允许我使用JSON文件目录作为缓存;即使JSON文件在过期后仍保留在磁盘上,Redis也支持Redis的过期(该文件的mtime用于计算过期时间)。如果我更改了中的缓存配置ansible.cfg,则可以激活它:

fact_caching = jsonfile
fact_caching_connection = /tmp/mycachedir

“连接”设置必须指向一个可写目录,该目录中存储了每个主机包含JSON格式事实的文件。memcached也存在用于缓存的插件。任何收集事实的剧本都会有效地填充其所说话的计算机的缓存。

以下剧本与www01机器无关,但可以从缓存访问该机器的事实。(city 事实不是Ansible中的默认值:我使用进行了设置facts.d。)

---
- hosts:
  - ldap21
  gather_facts: False
  tasks:
  - action: debug msg="City of www01 = {{ hostvars['www01'].ansible_local.system.location.city }}"
PLAY [ldap21] **************************************************************

TASK: [debug msg="City of www01 = {{ hostvars['www01'].ansible_local.system.location.city }}"] ***
ok: [ldap21] => {
    "msg": "City of www01 = Boston"
}

一旦缓存条目到期,这些事实变量将是未定义的,并且播放将失败。

填充或恢复事实缓存很简单:我将根据配置的缓存超时定期运行以下剧本:了解更多关于Ansible自动化相关知识

---
- hosts:
  - all
  gather_facts: True

如有疑问,请通过调用ansible-playbook该--flush-cache选项清除高速缓存。

※更多文章和资料|点击后方文字直达 ↓↓↓
100GPython自学资料包
阿里云K8s实战手册
[阿里云CDN排坑指南]CDN
ECS运维指南
DevOps实践手册
Hadoop大数据实战手册
Knative云原生应用开发指南
OSS 运维实战手册
云原生架构白皮书
Zabbix企业级分布式监控系统源码文档
云原生基础入门手册
10G大厂面试题戳领

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/woshijiuke/p/13553645.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!