ansible系列(22)--ansible的Facts Variables
1 Ansible Facts Variables
Ansible facts
用来自动采集,”被控端主机“ 自身的状态信息。
比如: 主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等。
1.1 facts的获取方法
被控节点的facts
信息需要使用ansible
的setup
模块进行获取,使用filte
r参数可以过滤特定的Facts
变量:
facts
中的变量可以直接引用,无需获取。
示例一:获取被控主机的信息:
#获取主机名:
[root@xuzhichao ansible_var]# ansible 192.168.20.23 -m setup -a 'filter=ansible_fqdn'
192.168.20.23 | SUCCESS => {
"ansible_facts": {
"ansible_fqdn": "nginx03.lan",
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
} #模糊匹配,获取主机名:
[root@xuzhichao ansible_var]# ansible 192.168.20.23 -m setup -a 'filter=*name'
192.168.20.23 | SUCCESS => {
"ansible_facts": {
"ansible_hostname": "nginx03",
"ansible_nodename": "nginx03",
"ansible_product_name": "VMware Virtual Platform",
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
} #查看系统版本信息:
[root@xuzhichao ansible_var]# ansible 192.168.20.23 -m setup -a 'filter=*version*'
192.168.20.23 | SUCCESS => {
"ansible_facts": {
"ansible_bios_version": "6.00",
"ansible_distribution_major_version": "7", <==centos主版本
"ansible_distribution_version": "7.8", <==centos版本
"ansible_kernel_version": "#1 SMP Tue Mar 31 23:36:51 UTC 2020",
"ansible_product_version": "None",
"ansible_python_version": "2.7.5",
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
示例二:在
playbook
中直接调用facts
变量:[root@xuzhichao playbook]# cat fact.yml
- hosts: NginxWebs
remote_user: root tasks:
- name: Output ansible variables facts
debug:
msg:
- this default IPv4 address "{{ ansible_fqdn}}" is "{{ ansible_default_ipv4.address }}"
运行结果如下:
[root@xuzhichao playbook]# ansible-playbook fact.yml PLAY [NginxWebs] ********************************************************************************************************************************************* TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.20.23]
ok: [192.168.20.22] TASK [Output ansible variables facts] ************************************************************************************************************************
ok: [192.168.20.22] => {
"msg": [
"this default IPv4 address \"nginx02.lan\" is \"192.168.2.149\""
]
}
ok: [192.168.20.23] => {
"msg": [
"this default IPv4 address \"nginx03.lan\" is \"192.168.2.158\""
]
}
1.2 根据主机IP地址生成Redis配置文件
在redis
配置文件中,需要绑定主机的IP
地址,可以通过fact
变量获取主机地址,然后在redis
配置文件中调用fact
变量。
编写安装
redis
的playbook
文件:[root@xuzhichao playbook]# cat install_redis.yml
- hosts: redissers
remote_user: root tasks:
- name: Install Redis Server
yum:
name: redis
state: present - name: Configure Redis Server
template:
src: conf/redis.conf.j2
dest: /etc/redis.conf
owner: "redis"
group: "root"
mode: "0644"
notify: Restart Redis Server - name: Start Redis Server
service:
name: redis
state: started handlers:
- name: Restart Redis Server
service:
name: redis
state: restarted
修改
redis
的配置模板文件:[root@xuzhichao playbook]# vim conf/redis.conf.j2
......
bind 127.0.0.1 {{ ansible_eth1.ipv4.address }}
......
运行
playbook
文件:[root@xuzhichao playbook]# ansible-playbook install_redis.yml
1.3 根据主机CPU核数生成Nginx配置
nginx
的配置文件中启动的nginx
进程数需要根据主机的CPU
核心数进行设置,此时可以使用fact
变量获取nginx
主机的CPU
核心数,然后在nginx
配置文件中定义调用fact
变量。
fact
变量中关于CPU
核心的值为:
- ansible_processor_cores: 4 :每颗物理
CPU
的核心数 - ansible_processor_count: 2 :
CPU
颗数 (有几个CPU
) - ansible_processor_vcpus: 8 :
CPU
总核心数
配置示例如下:
编写安装
nginx
的playbook
文件:[root@xuzhichao playbook]# cat install_nginx.yml
- hosts: NginxWebs
remote_user: root tasks:
- name: Install Nginx Server
yum:
name: nginx
state: present - name: Configure Nginx Server
template:
src: conf/nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: "root"
group: "root"
mode: "0644"
notify: Restart Nginx Server - name: Start Nginx Server
service:
name: nginx
state: started handlers:
- name: Restart Nginx Server
service:
name: nginx
state: restarted
修改
redis
的配置模板文件:[root@xuzhichao playbook]# vim conf/nginx.conf.j2
......
worker_processes {{ ansible_processor_vcpus * 2 }}; <==nginx的进程数为CPU核心数*2,(支持+-*/运算);
......
运行
playbook
文件:[root@xuzhichao playbook]# ansible-playbook install_nginx.yml
1.4 根据主机内存生成Memcached配置
Memcached
服务需要根据主机的内存来设置启用缓存的大小,此时可以使用fact
变量获取memcached
主机的内存,然后在memcached
配置文件中定义调用fact
变量。
- ansible_memtotal_mb:主机的内存大小
配置示例如下:
编写安装
memcached
的playbook
文件:[root@xuzhichao playbook]# cat install_memcached.yml
- hosts: memcachedsers
remote_user: root tasks:
- name: Install Memcached Server
yum:
name: nmemcached
state: present - name: Configure Memcached Server
template:
src: conf//memcached.j2
dest: /etc/sysconfig/memcached
owner: "root"
group: "root"
mode: "0644"
notify: Restart Memcached Server - name: Start Memcached Server
service:
name: memcached
state: started handlers:
- name: Restart Memcached Server
service:
name: memcached
state: restarted
修改
memcached
的配置模板文件:[root@xuzhichao playbook]# cat memcached.j2
PORT="11211"
USER="memcached"
MAXCONN="1024"
#根据内存状态生成不同的配置(支持+-*/运算)
CACHESIZE="{{ ansible_memtotal_mb //2 }}"
OPTIONS=""
1.5 facts变量优化方案
虽然facts
变量非常有用,但是使用了facts
变量后会大大增加ansible
运行的时长,因为每次运行都需要去获取所有被控主机的facts
变量,可以使用以下两种方法增加ansible
的执行速度。
注意:在被控主机较多时才会明显感受到ansible
执行速度的提升。
1.5.1 方式1-关闭facts采集加速执行
编写
TASK
任务sleep10
秒,针对15
台机器同时执行,需要消耗的时间大概是1m54.980s
[root@m01 ~]# cat ansible_facts.yml
- hosts: all
tasks:
- name: sleep 10
command: sleep 10
使用
gather_facts: no
关闭facts
信息采集,发现仅花费了0m38.164s
,整个速度提升了3
倍,如果调整forks
操作的主机的数量,也可以得到非常大的提升;[root@m01 ~]# cat ansible_facts.yml
- hosts: all
gather_facts: no <==关闭facts采集功能
tasks:
- name: sleep 10
command: sleep 10
1.5.2 方式2-使用Redis缓存facts加速
当我们使用
gather_facts: no
关闭facts
,确实能加速Ansible
执行,但是有时候又需要使用facts
中的内容,还希望执行的速度快一点,这时候可以设置facts
的缓存;[root@xuzhichao playbook]# yum install python2-redis
[root@xuzhichao playbook]# yum install python2-pip
[root@xuzhichao playbook]# pip install --upgrade pip
[root@xuzhichao playbook]# pip install redis
[root@xuzhichao playbook]# systemctl start redis [root@xuzhichao playbook]# cat /etc/ansible/ansible.cfg
[defaults]
# smart 表示默认收集 facts,但 facts 已有的情况下不会收集,即使用缓存 facts
# implicit 表示默认收集 facts,要禁止收集,必须使用 gather_facts: False;
# explicit 则表示默认不收集,要显式收集,必须使用 gather_facts: Ture。
gathering = smart #在使用 facts 缓存时设置为smart
fact_caching_timeout = 86400
fact_caching = redis
fact_caching_connection = 192.168.20.23:6379 # 若 redis 设置了密码
# fact_caching_connection = localhost:6379:0:admin
测试缓存:
#发现已经不再收集facts信息了
[root@xuzhichao playbook]# ansible-playbook install_redis.yml PLAY [NginxWebs] ********************************************************************************************************************************************** TASK [Install Redis Server] ***********************************************************************************************************************************
changed: [192.168.20.23]
changed: [192.168.20.22] TASK [Configure Redis Server] *********************************************************************************************************************************
changed: [192.168.20.23]
changed: [192.168.20.22] TASK [Start Redis Server] *************************************************************************************************************************************
changed: [192.168.20.23]
changed: [192.168.20.22] RUNNING HANDLER [Restart Redis Server] ************************************************************************************************************************
changed: [192.168.20.23]
changed: [192.168.20.22] PLAY RECAP ****************************************************************************************************************************************************
192.168.20.22 : ok=4 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.20.23 : ok=4 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
在
redis
上也可以看到缓存信息:[root@nginx03 ~]# redis-cli
127.0.0.1:6379> keys *
1) "ansible_cache_keys"
2) "ansible_facts192.168.20.23"
3) "ansible_facts192.168.20.22"
ansible系列(22)--ansible的Facts Variables的更多相关文章
- Ansible 小手册系列 十二(Facts)
Facts 是用来采集目标系统信息的,具体是用setup模块来采集得. 使用setup模块来获取目标系统信息 ansible hostname -m setup 仅显示与ansible相关的内存信息 ...
- Ansible系列(二):选项和常用模块
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
- Ansible系列(六):各种变量定义方式和变量引用
本文目录:1.1 ansible facts1.2 变量引用json数据的方式 1.2.1 引用json字典数据的方式 1.2.2 引用json数组数据的方式 1.2.3 引用facts数据1.3 设 ...
- Ansible系列(七):执行过程分析、异步模式和速度优化
本文目录:1.1 ansible执行过程分析1.2 ansible并发和异步1.3 ansible的-t选项妙用1.4 优化ansible速度 1.4.1 设置ansible开启ssh长连接 1.4. ...
- Ansible系列(五):各种变量定义方式和变量引用
Ansible系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1.1 ansible facts facts组件是用来收集被管理节点信息的 ...
- Ansible系列(一):基本配置和使用
本文目录:1.1 安装Ansible1.2 配置Ansible 1.2.1 环境配置 1.2.2 SSH互信配置 1.2.3 简单测试1.3 inventory Ansible是一种批量.自动部署工具 ...
- Ansible系列(五):playbook应用和roles自动化批量安装示例
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
- Ansible系列(六):循环和条件判断
本文目录:1. 循环 1.1 with_items迭代列表 1.2 with_dict迭代字典项 1.3 with_fileglob迭代文件 1.4 with_lines迭代行 1.5 with_ne ...
- Ansible系列(四):playbook应用和roles自动化批量安装示例
Ansible系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html playbook是ansible实现批量自动化最重要的手段.在其中可以使用变 ...
- Ansible系列(三):YAML语法和playbook写法
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
随机推荐
- C++设计模式 - 原型模式(Prototype)
对象创建模式 通过"对象创建" 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 Fac ...
- 如在 Java 中分割 Excel 工作表
前言 在Excel中创建的大多数商业报告不是单页的文档,而是包含了多个上下文相关的信息,这些信息被存储在多个工作表中.例如我们的一些地区销售报告.按部门分类的员工记录.每家店铺的库存清单等. 然而,随 ...
- 学习Source Generators之IncrementalValueProvider
前面我们使用了IIncrementalGenerator来生成代码,接下来我们来详细了解下IIncrementalGenerator的核心部分IncrementalValueProvider. 介绍 ...
- #状压dp,背包,贪心#洛谷 5997 [PA2014]Pakowanie
题目 你有 \(n\) 个物品和 \(m\) 个包.物品有重量,且不可被分割: 包也有各自的容量.要把所有物品装入包中,至少需要几个包? 分析 考虑物品的数量很小,首先优先选容量大的背包, 设\(f[ ...
- 如何知道 window 的 load 事件已经触发
背景 为了使页面加载更快,常常将一些不重要的第三方脚本在页面完成加载后进行懒加载. // 做一些不影响业务的事情 window.addEventListener('load', () => { ...
- OpenHarmony 3.2 Beta源码分析之MediaLibrary
1.MediaLibrary介绍 OpenAtom OpenHarmony(以下简称"OpenHarmony")MediaLibrary媒体库提供了一系列易用的接口用于获取媒体文件 ...
- openGauss数据库xlog目录满问题处理
openGauss 数据库 xlog 目录满问题处理 openGauss 数据库 xlog 满通常为以下几个原因: 1.主备状态不正常,存在网络问题,集群内有宕机的节点 2.xlog 保留数量过多 3 ...
- 京东一面:如何在SpringBoot启动时执行特定代码?有哪些方式?
引言 Spring Boot 提供了许多便捷的功能和特性,使得开发者可以更加轻松地构建强大.高效的应用程序.然而,在应用程序启动时执行一些初始化操作是至关重要的,它可以确保应用程序在启动后处于预期的状 ...
- 94个JS/eTS开源组件首发上新,肯定有你要用的一款!
原文:https://mp.weixin.qq.com/s/6RdxNisTQoyPds811PNZKA,点击链接查看更多技术内容. 2021年的华为开发者大会(HDC2021)上,我们发布了新一代的 ...
- 推荐几款Vue后台管理系统的框架,以便备用
推荐几款Vue后台管理系统的框架,以便备用 Vue.js 是一个目前比较流行的前端框架,在业界也算很有名气,今天这里为大家罗列一下基于Vue的后端管理的框架. 使用这些框架你会发现它包括了我们常用的路 ...