1️⃣:Ansible事实是Ansible在受管主机上自动检测到的变量
2️⃣:事实(fact)中包含有与主机相关的信息,可以像play中的常规变量、条件、循环或依赖于从受管主机收集的值的任何其他语句那样使用
3️⃣:一些事实可能包括:
主机名称、内核版本、网络接口、IP地址、操作系统版本、各种环境变量、CPU数量、提供的或可用的内存、可用磁盘空间等等
4️⃣:借助事实,可以方便地检索受管主机的状态,并根据该状态确定要执行的操作
例如:
5️⃣:每个play在执行第一个任务之前会先自动运行setup模块来收集事实
演示实例:使用debug模块显示ansible_facts变量值为受管主机收集事实
//查看playbook文件
hosts: all
tasks:
//执行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文件
hosts: all
tasks:
//执行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
1️⃣:较早的变量注入:
在Ansible2.5之前,事实是作为前缀为字符串ansible_的单个变量注入,而不是作为ansible_facts变量的一部分注入
可以使用临时命令来运行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
1️⃣:要为play禁用事实收集功能,可将gather_facts关键字设置为no
演示实例:
2️⃣:即使play设置了gather_facts: no,也可以随时通过运行使用setup模块的任务来手动收集事实
演示实例:
hosts: all
gather_facts: no
tasks:
name: get ansible_facts
setup:
name: test debug
debug:
var: ansible_facts
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
hosts: all
tasks:
//执行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文件内容
hosts: all
tasks:
//执行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另外一种方式
1️⃣:一些变量并非事实或通过setup模块配置,但也由Ansible自动设置。这些魔法变量也可用于获取与特定受管主机相关的信息
2️⃣:常用的魔法变量
魔法变量
说明
hostvars
包含受管主机的变量,可以用于获取另一台受管主机的变量的值。
如果还没有为受管主机收集事实,则它不会包含该主机的事实。
group_names
列出当前受管主机所属的所有组
groups
列出清单中的所有组和主机
inventory_hostname
包含清单中配置的当前受管主机的主机名称。
因为各种原因有可能与事实报告的主机名称不同
3️⃣:更多魔法变量,请参考官方文档:https://docs.ansible.com/ansible/latest/reference_appendices/special_variables.html#special-variables
手机扫一扫
移动阅读更方便
你可能感兴趣的文章