1、事实包含的内容
主机名称、内核版本、网络接口、IP地址等
2、事实查看
2.1 命令行中可用 ansible localhost -m setup 对localhost主机的事实进行查看,
##显示当前主机事实
ansible localhost -m setup
localhost | SUCCESS => { ##事实结果
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"172.25.254.100",
"192.168.122.1"
],
"ansible_all_ipv6_addresses": [
"fe80::20c:29ff:fed8:6f74"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "07/29/2019",
"ansible_bios_version": "6.00",
....
2.2 playbook中可用变量(ansible_facts)的方式进行查看
#编写事实查看
1 ---
2 - name: Fact
3 hosts: all
4 tasks:
5 - name: show fact
6 debug:
7 var: ansible_facts ##ansible_fatcs 可以查看定义主机的事实
#用playbook直接调用剧本即可
[root@contral fact]# ansible-playbook fact.yml
PLAY [Fact] ***************************************************************************
TASK [Gathering Facts] ****************************************************************
ok: [servera.linux.com]
TASK [show fact] ##显示事实内容
**********************************************************************
ok: [servera.linux.com] => {
"ansible_facts": {
"_facts_gathered": true,
"all_ipv4_addresses": [
"172.25.254.200",
"192.168.122.1"
],
.....
3、事实调用
根据事实变量查看所拥有的事实,此时查看的事实是以JSON格式显示的,在调用时可以使用字典的方式进行调用,
##编写剧本
1 ---
2 - name: Fact
3 hosts: all
4 tasks:
5 - name: show fact
6 debug:
7 var: ansible_facts
8 - hosts: all
9 tasks:
10 - name: Print ansible facts
11 debug:
12 msg:
13 The IPV4 address of {{ ansible_facts.fqdn }} ##以字典变量的方式调用
14 is {{ ansible_facts.all_ipv4_addresses }}
##调用结果
PLAY [all] ****************************************************************************
TASK [Gathering Facts] ****************************************************************
ok: [servera.linux.com]
TASK [Print ansible facts] ##debug结果
************************************************************
ok: [servera.linux.com] => {
"msg": "The IPV4 address of servera.linux.com is [u'172.25.254.200', u'192.168.122.1']"
}
4、魔法变量
常见魔法变量:
hostvars:包含受管主机的变量,可以用于获取另一台受管主机的变量的值
group_names:列出当前受管主机所属的所有组
groups:列出清单中的所有组和主机
inventory_hostname:包含清单中配置的当前受管主机的主机名称
##列出清单中配置的当前变量的名称
1 ---
2 - name: Fact
3 hosts: all
4 tasks:
5 - name: show fact
6 debug:
7 var: inventory_hostname
##剧本调用
[root@contral fact]# ansible-playbook fact.yml
PLAY [Fact] ***************************************************************************
TASK [Gathering Facts] ****************************************************************
ok: [servera.linux.com]
TASK [show fact] **********************************************************************
ok: [servera.linux.com] => {
"inventory_hostname": "servera.linux.com"
}
5、编写自定义事实
自定义事实有两种:INI格式和JSON格式;其中INI格式更方便人的阅读,JSON格式更方便机器的阅读
##INI格式
[packages]
web_pkg = httpd
db_pkg = mariadb-server
[users]
user1 = wondoes
user2 = linux
##JSON格式
{
"packages":{
"web_packages":"httpd",
"db_packages":"mariadb"
},
"users":{
"user1":"linux",
"user2":"redhat"
}
}
定义事实时编写的事实文件必须以.fact结尾,自定义事实的使用和普通事实的使用方式是相同的。
6、关闭事实收集
事实的收集会浪费运行时间,在某些情况下,我们并没有用到事实变量,所以此时可以关闭事实的收集,以提高效率。
关键字:gather_facts:no
##关闭事实收集
1 ---
2 - name: Configure User
3 hosts: servera.linux.com
4 gather_facts: no ##no关闭
5 tasks:
6 - name: Linux user
7 user:
8 name: linux
9 uid: 1000
10 state: present
11 ...
剧本结果:
[root@contral fact]# ansible-playbook user.yml
PLAY [Configure User] *****************************************************************
##这里没有事实收集的过程,直接进行任务
TASK [Linux user] *********************************************************************
ok: [servera.linux.com]
PLAY RECAP ****************************************************************************
servera.linux.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
7、事实示例
事实文件:test.fact
##编写事实文件:test.fact
1 [webserver]
2 package = httpd
3 service = httpd
4 state = started
5 enabled = true
编写playbook进行调用(这里虽然代码看起来过于冗余,但复用性很高)
##编写主playbook,安装并启动Apache服务
1 ---
2 - name: Install Apache and starts
3 hosts: web
4 tasks:
5 - name: Install Packages
6 yum:
7 name: "{{ ansible_facts['ansible_local']['test']['webserver']['package'] }}"
8 state: latest
9 - name:
10 service:
11 name: "{{ ansible_facts['ansible_local']['test']['webserver']['service'] }} "
12 state: "{{ ansible_facts['ansible_local']['test']['webserver']['state'] }}"
13 enabled: "{{ ansible_facts['ansible_local']['test']['webserver']['enabled'] }}"
对执行结果进行检测:
##结果检测
[root@contral fact]# ansible servera.linux.com -m command -a "systemctl status httpd"
servera.linux.com | CHANGED | rc=0 >>
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2020-04-11 19:07:02 CST; 14h ago
Docs: man:httpd.service(8)
Process: 43260 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
....