文章目录

  • fact简介
  • 自定义fact
    • 1.手动设置fact
  • 2.使用set_fact模块定义新的变量
  • 手动采集fact
  • 启用fact缓存
    • 1.Json文件fact缓存后端
    • 2.Redis fact缓存后端
    • 3.Memcached fact缓存后端
  • 关闭fact

fact简介

ansible有一个模块叫setup,用于获取远程主机的相关信息,并可以将这些信息作为变量在playbook里进行调用。而

setup模块获取这些信息的方法就是依赖于fact。

# ansible test -m setup
10.1.61.187 | SUCCESS => {"ansible_facts": {"ansible_all_ipv4_addresses": ["10.1.61.187"],"ansible_all_ipv6_addresses": ["fe80::f816:3eff:fe4f:6611"],"ansible_apparmor": {"status": "disabled"},"ansible_architecture": "x86_64","ansible_bios_date": "04/01/2014","ansible_bios_version": "Ubuntu-1.8.2-1ubuntu1~cloud0",...output omitted...
}

setup获取的这些信息,都是可用于该主机的变量。

setup模块其他用法示例:

# 查看主机内存信息
ansible 10.212.52.252 -m setup -a 'filter=ansible_*_mb'# 查看地接口为eth0-2的网卡信息
ansible 10.212.52.252 -m setup -a 'filter=ansible_eth[0-2]'# 将所有主机的信息输入到/tmp/facts目录下,每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的
ansible all -m setup --tree /tmp/facts

自定义fact

1.手动设置fact

ansible除了能获取到预定义的fact的内容,还支持手动为某个主机定制fact。称之为本地fact。本地fact默认存放于被控

端的 /etc/ansible/facts.d 目录下,如果文件为 ini 格式或者 json 格式,ansible会自动识别。以这种形式加载的fact是key为 ansible_local 的特殊变量。

下面是一个简单的示例,在ansibler主控端定义一个 ini 格式的custom.fact文件内容如下:

[general]
package = httpd
service = httpd
state = started

然后我们编写一个playbook文件名为setup_facts.yml内容如下:

---
- name: Install remote factshosts: testvars: remote_dir: /etc/ansible/facts.dfacts_file: custom.facttasks:- name: Create the remote directoryfile:state: directoryrecurse: yespath: "{{ remote_dir }}"- name: Install the new factscopy:src: "{{ facts_file }}"dest: "{{ remote_dir }}"

执行该playbook,完成facts的推送:

ansible-playbook setup_facts.yml

此时,我们可以在被控端看到新的facts已经生成:

# ansible test -m setup 10.1.61.187 | SUCCESS => {"ansible_facts": {...output omitted..."ansible_local": {"custom": {"general": {"package": "httpd","service": "httpd","state": "started"}}},...output omitted...}

我们可以写一个简单的playbook来使用这些facts:

- name: Install Apache and starts the servicehosts: testtasks:- name: Install the required packageyum: name: "{{ ansible_facts.ansible_local.custom.general.package }}"state: latest- name: Start the serviceservice: name: "{{ ansible_facts.ansible_local.custom.general.service }}"state: "{{ ansible_facts.ansible_local.custom.general.state }}"

2.使用set_fact模块定义新的变量

set_fact 模块可以自定义facts,这些自定义的facts可以通过template或者变量的方式在playbook中使用。如果你想

要获取一个进程使用的内存的百分比,则必须通过set_fact来进行计算之后得出其值,并将其值在playbook中引用。

下面是一个set_fact模块的应用示例:

- name: set_fact examplehosts: testtasks:- name: Calculate InnoDB buffer pool sizeset_fact: innodb_buffer_pool_size_mb="{{ ansible_memtotal_mb / 2 |int }}"- debug: var=innodb_buffer_pool_size_mb

执行playbook如下:

# ansible-playbook set_fact_ex.yaml
PLAY [set_fact example] *******************************************************************
TASK [Gathering Facts] ********************************************************************
ok: [10.1.61.187]
TASK [Calculate InnoDB buffer pool size] **************************************************
ok: [10.1.61.187]
TASK [debug] ******************************************************************************
ok: [10.1.61.187] => {"innodb_buffer_pool_size_mb": "3911.0"
}
PLAY RECAP ********************************************************************************
10.1.61.187 : ok=3 changed=0 unreachable=0 failed=0 skipped=0

这种设置方式只在当前playbook当中有效

手动采集fact

通常情况下,我们在运行play的时候,ansible会先尝试ssh到被控端采集fact,如果此时,被控制端的ssh还没有完全启

动,就会导致整个play执行失败。这个时候,我们可以先显式的关闭fact采集,然后在task中通过wait_for等待被控端

ssh端口被正常监听,再在task中使用setup模块来手动采集fact:

- name: Deploy appshosts: webserversgather_facts: Falsetasks:- name: wait for ssh to be runninglocal_action: wait_for port=22 host="{{ inventory_hostname }}" search_regex=OpenSSH- name: gather factssetup:......

启用fact缓存

如果在play中需要引入fact,则可以开启fact缓存。fact缓存目前支持三种存储方式,分别为JSON、memcached、

redis。

1.Json文件fact缓存后端

使用JSON文件作为fact缓存后端的时候,ansible将会把采集的fact写入到控制主机的文件中。

ansible.cfg配置如下:

[defaults]gathering = smart#缓存时间,单位为秒fact_caching_timeout = 86400 fact_caching = jsonfile#指定ansible包含fact的json文件位置,如果目录不存在,会自动创建fact_caching_connection = /tmp/ansible_fact_cache

选项说明:

●gathering: 是否启用fact,有三个选项:

●fact_cacheing_tmeout:缓存时间,单位为s

●fact_caching:缓存的方式,支持jsonfifile、redis、memcached

●fact_caching_connecƟon:指定ansible缓存fact的连接方式,如果是jsonfifile,则指定jsonfifile的缓存路径

2.Redis fact缓存后端

使用redis作为fact缓存后端,需要在控制主机上安装redis服务并保持运行。需要安装python操作redis的软件包。

ansible.cfg配置如下:

[defaults]
gathering = smart
fact_caching_timeout = 86400
fact_caching = redis
fact_caching_connection = 127.0.0.1:6379:0

3.Memcached fact缓存后端

使用memcached作为fact缓存后端,需要在控制主机上安装Memcached服务并保持运行,需要安装python操作

memcached的软件包。

ansible.cfg配置如下:

[defaults]
gathering = smart
fact_caching_timeout = 86400
fact_caching = memcached
fact_caching_connection = 127.0.0.1:11211

关闭fact

如果不想从fact中获取变量,或者说整个playbook当中都没有使用到fact变量,可以通过如下方法关闭fact以提升执行

效率:

- hosts: testgather_facts: no

也可以在ansible.cfg中添加如下配置:

[defaults]
gathering = explicit

9.ansible变量之fact相关推荐

  1. 【Ansible自动化运维工具】Ansible变量之lookup生成变量方法

    [Ansible自动化运维工具]Ansible变量之lookup生成变量方法 一.lookup插件介绍 1.lookup简介 2.lookup使用场景 3.lookup获取的数据源 4.lookup的 ...

  2. 【Ansible自动化运维工具】Ansible变量之Facts变量

    [Ansible自动化运维工具]Ansible变量之Facts变量 一.Ansible facts介绍 1.facts组件简介 2.facts组件的使用场景 二.Ansible facts的基本使用 ...

  3. 面试官问:你能介绍一下Ansible变量吗?之后你噼里啪啦讲得太详细让面试官惊呆了

  4. ansible的变量和机密

    1. ansible的变量 ​ 在ansible中使用变量,能让我们的工作变得更加灵活,在ansible中,变量的使用方式有很多种我们下面一一介绍. 1.1 变量的命名 ​ 变量名应该由字母.数字.下 ...

  5. ansible 高级自动化变量及变量过滤器

    文章目录 ansible 变量 ansible变量过滤器 1. 变量类型 2. 通用变量过滤器 3. 基础变量过滤器 4. 特殊处理过滤器 5. 复杂数据格式处理 6. 万能处理插件 Lookup / ...

  6. Ansible 使用变量

    使用变量 虽然自动化的存在是为了更容易使事情可重复,但并非所有系统都完全相同.有些可能需要与其他配置略有不同的配置.在某些情况下,观察到的一个系统的行为或状态可能会影响您配置其他系统的方式.例如,您可 ...

  7. Ansible进阶变量

    Ansible变量 1.Ansible变量最常见的是以下四种: 1.1.ansible变量可以用命令行(不推荐) 1.2.在剧本中vars定义一个变量 1.3.在配置文件中做变量(推荐多个剧本都可使用 ...

  8. Ansible的管理变量、机密和事实

    文章目录 管理变量.机密和事实 1.管理变量 1.1Ansible变量简介 1.1.1 命令变量 1.12 定义变量 1.2 playbook中的变量 1.2.1在Playbook中定义变量 1.2. ...

  9. Ansible 入门指南 - ansible-playbook 命令

    上篇文章Ansible 入门指南 - 安装及 Ad-Hoc 命令使用介绍的额是 Ad-Hoc 命令方式,本文将介绍 Playbook 方式. Playbook 译为「剧本」,觉得还挺恰当的. play ...

  10. ansible基础-playbooks

    1. playbooks介绍 如果说ansible的modules是工具,inventory配置文件是原材料,那么playbook就是一封说明书,这里会记录任务是如何如何执行的,当然如果你愿意,这里也 ...

最新文章

  1. JGG:华中师大蒋兴鹏组-不同稀疏水平信号的微生物组关联检验方法
  2. java中的进制输出转换_Java I/O : Java中的进制详解
  3. laravel controller
  4. VTK:图片之ImageToPolyDataFilter
  5. 开发一个爆款 VS Code 插件这么简单!
  6. 文房四宝用计算机取代的什么,《文房四宝》阅读练习及答案
  7. Ubuntu下用eclipse调试caffe code
  8. r语言 林元震_科学网—R语言简介 - 林元震的博文
  9. 单片机涡轮流量传感器_关于涡轮流量计传感器的维护保养
  10. 滚动条插件nicescroll的使用
  11. Python批量下载电子邮件附件并汇总合并Excel文件_如何让繁琐工作自动化:聊聊Python与RPA...
  12. js数组中判断是否有重复项
  13. 利用Python下载网络小说并保存到本地文件
  14. android textwatcher 获取当前控件,TextWatcher如何找到调用它的EditText
  15. 如何设置路由器wifi的用户黑名单?(使别人不能连接你家WIFI)
  16. 使用Axure实现原型设计(一)
  17. 视频教程-MMOARPG地下守护神_单机版实战视频课程(中部) -Unity3D
  18. JAVA练习题38:正则表达式基本练习
  19. 关于飞塔防火墙做端口聚合的时候应该如何选择端口可以达到最好效果。
  20. Java虚拟机学习资料整理

热门文章

  1. 护士人文修养测试题答案
  2. [QT Designer] QT Designer中资源文件的载入以及控件的设置
  3. 网站推广教程(SEO,优化)100条
  4. 非接触物体尺寸形态测量(G 题)
  5. python如何进行md5解密_python写一个md5解密器
  6. GitHub代码,资源下载慢?怎么办?
  7. supervised contrastive learning 解读
  8. BUUCTF:[XMAN2018排位赛]file
  9. Visual Studio .Net团队开发(Visual SourceSave6.0 在C#中的应用)
  10. centos 文件分割