【From】 https://blog.csdn.net/bruce_6/article/details/81328975

什么是 Ansible facts
Ansible facts 是远程系统的信息,主要包含IP地址,操作系统,以太网设备,mac 地址,时间/日期相关数据,硬件信息等信息。

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 缓存了。

设置 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。

使用 redis 缓存

gathering = smart
fact_caching_timeout =
fact_caching = redis
fact_caching_connection = 127.0.0.1: # 若 redis 设置了密码
# fact_caching_connection = localhost:::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:
- name: test ping
command: whoami

未使用 facts 缓存的耗时:

# time ansible-playbook ping.yml

PLAY [10.254.9.21] **********************************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************ok: [10.254.9.21]

TASK [test ping] ************************************************************************************************************************************************************changed: [10.254.9.21]

PLAY RECAP ******************************************************************************************************************************************************************10.254.9.21 : ok= changed= unreachable= failed=

real 0m15.870s
user 0m2.766s
sys 0m0.938s

使用缓存的耗时:

# time ansible-playbook ping.yml

PLAY [10.254.9.21] **********************************************************************************************************************************************************

TASK [test ping] ************************************************************************************************************************************************************changed: [10.254.9.21]

PLAY RECAP ******************************************************************************************************************************************************************10.254.9.21 : ok= changed= unreachable= failed=

real 0m3.037s
user 0m1.469s
sys 0m0.813s

可以发现,速度提升很多,由 15s 减少到只有 3s!

运行结束后,在 redis 中可以看到有如下数据:

$ redis-cli
127.0.0.1:> keys *
) "ansible_facts10.254.9.21"
) "ansible_cache_keys"

若使用的是 json 缓存,配置的目录中会生成如下文件:

$ tree facts_cache/
facts_cache/
└── 10.254.9.21 directories, file

其中存放的就是主机的 facts 信息。

总结

不同网络环境下的耗时肯定是不同的,但是设置缓存是肯定可以加快 Ansible 运行速度的,特别是 playbook 的运行。

另外,可以在空闲时间手动进行 facts 缓存的更新,从而避免执行真正的任务时再去更新缓存。

当然,优化 Ansible 运行速度还有其他方法,后面我再继续给大家分享。

如果觉得有用,欢迎关注我的微信,一起学习,共同进步,不定期推出赠书活动~

---------------------
作者:hoxis
来源:CSDN
原文:https://blog.csdn.net/bruce_6/article/details/81328975
版权声明:本文为博主原创文章,转载请附上博文链接!

[转] Ansible 进阶 | facts 缓存的更多相关文章

  1. [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能

    [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...

  2. [.net 面向对象程序设计进阶] (14) 缓存(Cache) (一) 认识缓存技术

    [.net 面向对象程序设计进阶] (14) 缓存(Cache)(一) 认识缓存技术 本节导读: 缓存(Cache)是一种用空间换时间的技术,在.NET程序设计中合理利用,可以极大的提高程序的运行效率 ...

  3. Hibernate中的实体规则、对象状态和进阶-一级缓存

    一.hibernate中的实体规则 1.实体类创建的注意事项 2.主键类型 3.主键生成策略 (1)代理主键 (2)自然主键 二.hibernate中的对象状态 1.对象分为三种状态 2.三种状态的转 ...

  4. devops工具-Ansible进阶playbook&roles

    一.playbook介绍     playbook 是 Ansible 管理配置.部署应用的核心所在,一个playbook由有多“play组成”,而一个play实际就是一个task,每个task是由多 ...

  5. Ansible进阶--playbook的使用

    一.什么是playbooksplaybooks是ansible的脚本.如同shell脚本一样,它是控制远程主机的一系列命令的集合,通过YAML语言编写.执行一些简单的任务,我们可以使用ad-hoc命令 ...

  6. Ansible 进阶技巧

    原文  http://www.ibm.com/developerworks/cn/linux/1608_lih_ansible/index.html?ca=drs-   简介 Ansible 是一个系 ...

  7. django进阶之缓存

    Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...

  8. Ansible进阶

    YAML YAML简介 YAML是一个可读性高,并用来表达资料序列的格式.YAML参考了其它多种语言,包括:XML.C语言.Python.Perl以及电子邮件格式RFC2822等 它是一种直观的能够被 ...

  9. ansible进阶模板和角色使用

    使用场景 Ansible 由于采用ssh远程连接登录管理,虽然不需要额外安装agent,但是速度慢效率低.不适合管理大规模的主机一般最大规模在200-300台,超大规模的主机管理适合使用puppet ...

随机推荐

  1. AspnetBoilerplate (ABP) Organization Units 组织结构管理

    ABP是一个成熟的.NET框架,功能完善.目前由于项目需要正在自学中. ABP对于组织节点管理这一基本上每个项目都要反复重复开发的内容,进行了自己的实现. 主要包括这些常用功能: 多租户 树结构管理的 ...

  2. 44个javascript 变态题解析

    原题来自: javascript-puzzlers 读者可以先去做一下感受感受. 当初笔者的成绩是 21/44… 当初笔者做这套题的时候不仅怀疑智商, 连人生都开始怀疑了…. 不过, 对于基础知识的理 ...

  3. STL中 map 和 multimap

    1. 所在头文件<map>. 命名空间std, 声明如下: namespace std{ template <class Key,class T, class Compare = l ...

  4. WordPaster2项目变化

    1.1.1. jsp 1.引入json2.min.js 2.控件名称改为WordPasterManager 3.文件保存逻辑更新,直接使用控件生成的文件名称 1.1.2. asp.net 1.引入js ...

  5. javascript 多个frame之间的交互

    主页面 Web.html  (加载了两个frame 分别为A.html) <html lang="en"> <head> <meta charset= ...

  6. C#中的异步调用及异步设计模式(二)——基于 IAsyncResult 的异步设计模式

    三.基于 IAsyncResult 的异步设计模式(设计层面) IAsyncResult 异步设计模式通过名为 BeginOperationName 和 EndOperationName 的两个方法来 ...

  7. 关于super关键字与继承

    super它只是一个限定词,当用super引用时,它也是引用当前对象本身,只是super只是限定了访问当前对象从父类那里继承得到成员变量或方法. import java.util.Date; publ ...

  8. alpha七天冲刺计划-第一天

    alpha七天冲刺计划-第一天 一.团队会议: 内容:具体分配任务到个人,预估项目时间,确定UI样式. 合照: 二.团队成员任务认领: 李尤:界面UI设计. 彭迪彬:HTML+CSS部分实现. 任路乾 ...

  9. VC中CDC与HDC的区别以及二者之间的转换

    CDC是MFC的DC的一个类 HDC是DC的句柄,API中的一个类似指针的数据类型. MFC类的前缀都是C开头的 H开头的大多数是句柄 这是为了助记,是编程读\写代码的好的习惯. CDC中所有MFC的 ...

  10. python抓网页数据【ref:http://www.1point3acres.com/bbs/thread-83337-1-1.html】

    前言:数据科学越来越火了,网页是数据很大的一个来源.最近很多人问怎么抓网页数据,据我所知,常见的编程语言(C++,java,python)都可以实现抓网页数据,甚至很多统计\计算的语言(R,Matla ...