事实简介
Ansible事实是指Ansible在受管主机上自动检测到的变量
事实中含有与主机相关的信息,可以像play中的常规变量,条件,循环等其他语句那样使用
受管主机收集的事实有以下部分
主机名称
内核版本
网络接口
IP地址
操作系统版本
环境变量
CPU数量
可用内存
可用磁盘空间
这些事实可以方便检索受管主机的状态并且根据状态确定要执行的操作
例如
根据含有受管主机当前内核版本的事实运行条件任务以此来重启服务器
根据通过事实报告的可用内存来自定义MySQL配置文件
收集事实
一般来说,每个play在执行第一个任务之前就会自动运行setup模块来收集事实
我们可以使用一些模块来查看和显示收集到的事实
debug模块
使用debug模块来显示ansible_facts变量值
- name: Fact dump
hosts: all
tasks:
- name: print all facts
debug:
var: ansible_facts
创建该任务之后使用ansible-playbook运行
Ansible事实作为变量注入
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'] |
简单的使用一下
---
- hosts: all
tasks:
- name: print various ansible facts
debug:
msg: >
the default IPV4 address of {{ ansible.facts.fqdn }}
is {{ ansible_facts.default_ipv4.address }}
在playbook中使用事实时,Ansible将事实的变量名动态替换为对应的值
关闭事实的自动收集
在playbook模块的开头 将gather_facts 关键字设置为no
---
- name: This play gathers no facts automatically
hosts: large_farm
gather_fact: no
创建自定义事实
管理员可以创建自定义事实并且存储到受管主机上,将这些自定义的事实整合到setup模块在受管主机上运行时收集的标准事实列表中。
静态文件
自定义事实在静态文件中定义,格式可以为INI文件或采用JSON
默认情况下setup模块从受管主机的/etc/ansible/facts.d目录下的文件和脚本中加载自定义事实
各个文件或者脚本名称必须是以 .fact结尾才能被识别使用
采用INI格式编写静态自定义事实文件
[package]
web_package = httpd
db-package = mariadb-server
[users]
user1 = joe
user2 = jane
采用JSON格式
{
"package": {
"web_package": "httpd"
"db_package": "mariadb-server"
}
"users": {
"user1": "joe"
"user2": "jane"
}
}
取得其中值的方法也很简单
假设有上述的文件
其ansible_facts.ansible_local['custom']['users']['user1']就是joe
动态文件
动态自定义事实脚本必须输出JSON格式的事实,且必须是可执行文件
管理事实实验
1.执行命令setup 收集所有的事实
ansible webserver -m setup
2.创建事实文件 定义要在servera上安装的软件包和要启动的服务
vimcustom.fact
[general]
package =httpd
service =httpd
state =started
enabled =true
3.创建playbook 生成远程目录并将上述的事实文件保存到该目录
vim setup_facts.yml
---
- name: install remote facts
hosts: webserver
vars:
remote_dir: /etc/ansible/facts.d
facts_files: custom.fact
tasks:
- name: create the remote directory
file:
state: directory
recurse: yes
path: "{{ remote_dir }}"
- name: install the new facts
copy:
src: "{{ facts_file }}"
dest: "{{ remote_dir }}"