Ansible_管理事实(Fact)
一、Ansible管理事实(fact)
1、Ansible事实描述
1️⃣:Ansible事实是Ansible在受管主机上自动检测到的变量
2️⃣:事实(fact)中包含有与主机相关的信息,可以像play中的常规变量、条件、循环或依赖于从受管主机收集的值的任何其他语句那样使用
3️⃣:一些事实可能包括:
主机名称、内核版本、网络接口、IP地址、操作系统版本、各种环境变量、CPU数量、提供的或可用的内存、可用磁盘空间等等
4️⃣:借助事实,可以方便地检索受管主机的状态,并根据该状态确定要执行的操作
例如:
- 可以根据含有受管主机当前内核版本的事实运行条件任务,以此来重启服务器
- 可以根据通过事实报告的可用内存来自定义MySQL配置文件
- 可以根据事实的值设置配置文件中使用的IPv4地址
5️⃣:每个play在执行第一个任务之前会先自动运行setup模块来收集事实
- 演示实例:使用debug模块显示ansible_facts变量值为受管主机收集事实
//查看playbook文件
[root@localhost project]# cat playbook.yaml
---
- hosts: all
tasks:
- name: 收集事实
debug:
var: ansible_facts //执行play收集事实
[root@localhost project]# ansible-playbook playbook.yaml
PLAY [all] ****************************************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************************
ok: [client.example.com]
TASK [收集事实] ***************************************************************************************************************************************************************
ok: [client.example.com] => {
"ansible_facts": {
"all_ipv4_addresses": [
"192.168.121.81"
],
"all_ipv6_addresses": [
"fe80::63e7:778f:ba5b:fa1d"
],
............ - Playbook以JSON格式显示ansible_facts变量的内容
- Ansible事实的示例:
事实 变量 短主机名 ansible_facts['hostname'] 完全限定域名 ansible_facts['fqdn'] IPv4地址 ansible_facts['default_ipv4']['address'] 所有网络接口的名称列表 ansible_facts['interfaces'] /dev/vda1磁盘分区的大小 ansible_facts['devices']['vda']['partitions']['vda1']['size'] DNS服务器列表 ansible_facts['dns']['nameservers'] 当前运行的内核版本 ansible_facts['kernel']
6️⃣:在playbook中使用事实时,Ansible将事实的变量名动态替换为对应的值
- 演示实例:
//查看playbook文件
[root@localhost project]# cat playbook.yaml
---
- hosts: all
tasks:
- name: 收集事实
debug:
msg: > // >:表示换行的意思
this host ip is {{ ansible_facts['default_ipv4']['address'] }}
this hostname is {{ ansible_facts['hostname']}} //执行playbook文件
[root@localhost project]# ansible-playbook playbook.yaml
PLAY [all] **************************************************************************************************************************************************************** TASK [Gathering Facts] ****************************************************************************************************************************************************
ok: [client.example.com] TASK [收集事实] ***************************************************************************************************************************************************************
ok: [client.example.com] => {
"msg": "this host ip is 192.168.121.81 this hostname is client\n"
}
PLAY RECAP ****************************************************************************************************************************************************************
client.example.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2、Ansible事实作为变量注入
1️⃣:较早的变量注入:
- 在Ansible2.5之前,事实是作为前缀为字符串ansible_的单个变量注入,而不是作为ansible_facts变量的一部分注入
- ansible_facts['distribution']事实会被称为ansible_distribution
- 可以使用临时命令来运行setup模块,以此形式显示所有事实的值:
- 演示实例:
[root@localhost project]# ansible all -m setup
client.example.com | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.121.81"
],
"ansible_all_ipv6_addresses": [
"fe80::63e7:778f:ba5b:fa1d"
],
"ansible_apparmor": {
"status": "disabled"
},
............
- 演示实例:
2️⃣:选定的Ansible事实名称比较
| ansible_facts形式 | 旧事实变量形式 |
|---|---|
| ansible_facts['hostname'] | ansible_hostname |
| ansible_facts['fqdn'] | ansible_fqdn |
| ansible_facts['default_ipv4']['address'] | ansible_default_ipv4['address'] |
| ansible_facts['interfaces'] | ansible_interfaces |
| ansible_facts['devices']['vda']['partitions']['vda1']['size'] | ansible_devices['vda']['partitions']['vda1']['size'] |
| ansible_facts['dns']['nameservers'] | ansible_dns['nameservers'] |
| ansible_facts['kernel'] | ansible_kernel |
3️⃣:将Ansible配置文件的[default]部分中inject_facts_as_vars参数设置为False,可关闭旧命名系统。默认设置为True
4️⃣:inject_facts_as_vars的默认值在Ansible的未来版本中可能会更改为False
- 如果设置为False,则只能使用新的ansible_facts.*命名系统引用Ansible事实
3、关闭事实收集
1️⃣:要为play禁用事实收集功能,可将gather_facts关键字设置为no
- 演示实例:
[root@localhost project]# cat playbook.yaml
---
- hosts: all
gather_facts: no
tasks:
- name: test file
debug:
var: anisble_facts
2️⃣:即使play设置了gather_facts: no,也可以随时通过运行使用setup模块的任务来手动收集事实
- 演示实例:
[root@localhost project]# cat playbook.yaml
---
- hosts: all
gather_facts: no
tasks:
- name: get ansible_facts
setup: - name: test debug
debug:
var: ansible_facts
4、创建自定义事实
1️⃣:除了使用系统捕获的事实外,我们还可以自定义事实,并将其本地存储在每个受管主机上;
2️⃣:默认情况下,setup模块从各受管主机的/etc/ansible/facts.d目录下的文件和脚本中加载自定义事实
3️⃣:各个文件或脚本的名称必须以.fact结尾才能被使用;动态自定义事实脚本必须输出JSON格式的事实,而且必须是可执行文件
4️⃣:演示实例:
- 方式一:采用INI格式编写的静态自定义事实文件
//在受管主机上创建自定义文件
[root@client ~]# mkdir -p /etc/ansible/facts.d
[root@client ~]# cd /etc/ansible/facts.d/
[root@client facts.d]# cat example.fact
[users]
user_one: zhangsan
user_two: lisi [servers]
service_one: httpd
service_two: mariadb //在控制节点上查看
[root@localhost project]# ansible all -m setup |less
..............
"ansible_local": {
"example": {
"servers": {
"service_one": "httpd",
"service_two": "mariadb"
},
"users": {
"user_one": "zhangsan",
"user_two": "lisi"
}
}
},
............... - 方式二: 以JSON格式提供事实,JSON事实等同于INI格式指定的事实,JSON数据可以存储在静态文本文件中
//查看用JSON格式写对fact文件
[root@client facts.d]# pwd
/etc/ansible/facts.d
[root@client facts.d]# cat test.fact
{
"users": {
"user_one": "zhangsan",
"user_two": "lisi"
},
"servers": {
"service_one": "httpd",
"service_two": "vsftpd"
}
} //在控制节点上查看
[root@localhost project]# ansible all -m setup |less
.............
"ansible_local": {
"test": {
"servers": {
"service_one": "httpd",
"service_two": "vsftpd"
},
"users": {
"user_one": "zhangsan",
"user_two": "lisi"
}
}
},
.............
5️⃣:自定义事实由setup模块存储在ansible_facts['ansible_local']变量中
- 事实按照定义它们的文件的名称来整理;例如:自定义事实由受管主机上保存为/etc/ansible/facts.d/example.fact的文件,在这种情况下,ansible_facts['ansible_local']['example']['users']['user_two']的值为lisi
- 演示实例:
//在控制节点编写playbook
[root@localhost project]# cat playbook.yaml
---
- hosts: all
tasks:
- name: 输出某个用户
debug:
msg: 该用户是:{{ ansible_facts['ansible_local']['example']['users']['user_one'] }} //执行playbook
[root@localhost project]# ansible-playbook playbook.yaml PLAY [all] **************************************************************************************************************************************************************** TASK [Gathering Facts] ****************************************************************************************************************************************************
ok: [client.example.com] TASK [输出某个用户] *************************************************************************************************************************************************************
ok: [client.example.com] => {
"msg": "该用户是:zhangsan"
} PLAY RECAP ****************************************************************************************************************************************************************
client.example.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 //查看与anisble_local上的信息是否正确
[root@localhost project]# ansible all -m setup |less
..............
"ansible_local": {
"example": {
"servers": {
"service_one": "httpd",
"service_two": "vsftpd"
},
"users": {
"user_one": "zhangsan",
"user_two": "lisi"
}
}
},
............. 
//查看playbook文件内容
[root@localhost project]# cat playbook.yaml
---
- hosts: all
tasks:
- name: 输出某个用户
debug:
var: ansible_facts['ansible_local']['example']['users']['user_one'] }} //执行playbook
[root@localhost project]# ansible-playbook playbook.yaml PLAY [all] **************************************************************************************************************************************************************** TASK [Gathering Facts] ****************************************************************************************************************************************************
ok: [client.example.com] TASK [输出某个用户] *************************************************************************************************************************************************************
ok: [client.example.com] => {
"ansible_facts['ansible_local']['example']['users']['user_one'] }}": "zhangsan}}"
} PLAY RECAP ****************************************************************************************************************************************************************
client.example.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0执行playbook另外一种方式
5、使用魔法(magic)变量
1️⃣:一些变量并非事实或通过setup模块配置,但也由Ansible自动设置。这些魔法变量也可用于获取与特定受管主机相关的信息
2️⃣:常用的魔法变量
| 魔法变量 | 说明 |
|---|---|
| hostvars | 包含受管主机的变量,可以用于获取另一台受管主机的变量的值。 如果还没有为受管主机收集事实,则它不会包含该主机的事实。 |
| group_names | 列出当前受管主机所属的所有组 |
| groups | 列出清单中的所有组和主机 |
| inventory_hostname | 包含清单中配置的当前受管主机的主机名称。 因为各种原因有可能与事实报告的主机名称不同 |
3️⃣:更多魔法变量,请参考官方文档:https://docs.ansible.com/ansible/latest/reference_appendices/special_variables.html#special-variables
Ansible_管理事实(Fact)的更多相关文章
- Ansible_管理playbook实现配置并行
一.使用forks在Ansible中配置并行 1.Aniable运行play机制 1️⃣:当Ansible处理playbook时,会按顺序运行每个play.确定play的主机列表之后,Ansible将 ...
- Ansible_管理机密
一.Ansible Vault 1.什么是Ansible Vault Ansible提供的Ansible Vault可以加密和解密任何由Ansible使用的结构化数据文件 若要使用Ansible Va ...
- SQLite vs MySQL vs PostgreSQL:关系型数据库比较
自1970年埃德加·科德提出关系模型之后,关系型数据库便开始出现,经过了40多年的演化,如今的关系型数据库种类繁多,功能强大,使用广泛.面对如此之多的关系型数据库,我们应该如何权衡找出适合自己应用场景 ...
- Ansible_变量管理与设置
一.Ansible变量管理 1.变量概述 Ansible支持利用变量来存储值,并在Ansible项目的所有文件中重复使用这些值.这可以简化项目的创建和维护,并减少错误的数量 通过变量,可以轻松地在An ...
- 程序员必须要知道的Hadoop的一些事实
程序员必须要知道的Hadoop的一些事实.现如今,Apache Hadoop已经无人不知无人不晓.当年雅虎搜索工程师Doug Cutting开发出这个用以创建分布式计算机环境的开源软...... 1: ...
- Android6.0运行时权限管理
自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装 ...
- .NET基础拾遗(1)类型语法基础和内存管理基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...
- 会议管理心得记录(非markdown版)
前提 本文说的会议特指有开发团队成员参与的会议, 包括但不限于开发.设计.测试.运维.管理岗位的成员. 因为不同工种和行业都有其特殊性,我是一名程序员,并不太了解其他工种和行业的具体情况,不敢妄言. ...
- [翻译]用 Puppet 搭建易管理的服务器基础架构(3)
我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第三部分. 本文由 伯乐在线 - Wing 翻译,黄利民 校稿.未经许可,禁止转载!英文出处:Manuel Kiessling.欢迎加 ...
随机推荐
- 201871030127-王明强 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 18级卓越班 这个作业要求链接 实验三 软件工程结对项目 我的课程学习目标 1.熟悉PSP流程2. 熟悉github操作3.加深对D{0-1}问题的解法的理解4.熟悉ja ...
- 痞子衡嵌入式:在i.MXRT启动头FDCB里调整Flash工作频率也需同步设Dummy Cycle
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是Flash工作频率与Dummy Cycle的联系. 上一篇文章 <从头开始认识i.MXRT启动头FDCB里的lookupTable ...
- 王炸!!IDEA 2021.1 推出语音、视频功能,边写代码边聊天,我真的服了…
IDEA 2020.3 刚没用多久,2021.1 又陆续给我推送更新了: 启动就提醒更新,麻烦,那不如更新下,体验下新版本. 如上图所示,2021.1 更新了 9 个新特性,下面栈长会一一体验给大家介 ...
- linux下更新gcc
1 下载源码 链接 目前最新为9.2版本. 2 解压 tar -zxvf gcc-9.2.0.tar.gz cd gcc-9.2.0 3 download_prerequisites脚本 运行这个脚本 ...
- Day02_15_方法重载
方法重载 1.什么是方法重载? * 方法重载又被称为 OverLoad,是指在同一个类中,具有相同方法名的不同方法,各个方法虽然方法名相同,但是各自的形式参数不同. 2.什么时候考虑使用方法重载? * ...
- 三个dom xss常用tips
分享dom xss的三个案例 (1)javascript里面过滤单引号和双引号? 搭建环境: 只是过滤了单引号和双引号是可以xss的: 使用<>闭合script即可 </script ...
- Java中的线程池用过吧?来说说你是怎么理解线程池吧?
前言 Java中的线程池用过吧?来说说你是怎么使用线程池的?这句话在面试过程中遇到过好几次了.我甚至这次标题都想写成[Java八股文之线程池],但是有点太俗套了.虽然,线程池是一个已经被说烂的知识点了 ...
- 【转】在CentOS 8 / RHEL 8上配置主/从BIND DNS服务器
转自: https://zh.codepre.com/centos-2700.html 前言 本指南描述了在CentOS 8 / RHEL 8 Linux上配置BIND DNS服务器所需的步骤.在Ce ...
- hdu3746 KMP的next数组应用,求项链首尾项链循环
题意: 给你一个项链,问你最少加多少个珠子能满足整个项链是一个循环的项链(首尾相连) 思路: KMP的简单应用只要了解next数组的意义就好说了,下面总结下 next在循环方面 ...
- 逆向与分析-WebBrowserPassView消息分析
逆向与分析-WebBrowserPassView消息分析 这个的源头是之前我写的一个博客: http://blog.csdn.net/u013761036/article/details/730427 ...