Ansible Facts 变量详解与使用案例
主机名称 | 操作系统版本 | 内网IP | 外网IP(模拟) | 安装软件 |
---|---|---|---|---|
ansi-manager | CentOS7.5 | 172.16.1.180 | 10.0.0.180 | ansible |
ansi-haproxy01 | CentOS7.5 | 172.16.1.181 | 10.0.0.181 | |
ansi-haproxy02 | CentOS7.5 | 172.16.1.182 | 10.0.0.182 | |
ansi-web01 | CentOS7.5 | 172.16.1.183 | 10.0.0.183 | |
ansi-web02 | CentOS7.5 | 172.16.1.184 | 10.0.0.184 | |
ansi-web03 | CentOS7.5 | 172.16.1.185 | 10.0.0.185 |
说明:
1、 运维人员使用的登录账号;
2、 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放;
3、 该用户也被 ansible 使用,因为几乎所有的生产环境都是禁止 root 远程登录的(因此该 yun 用户也进行了 sudo 提权)。
# 使用一个专门的用户,避免直接使用root用户
# 添加用户、指定家目录并指定用户密码
# sudo提权
# 让其它普通用户可以进入该目录查看信息
useradd -u 1050 -d /app yun && echo '123456' | /usr/bin/passwd --stdin yun
echo "yun ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
chmod 755 /app/
之后文章都是如下主机配置清单
[yun@ansi-manager ansible_info]$ pwd
/app/ansible_info
[yun@ansi-manager ansible_info]$ cat hosts_key
# 方式1、主机 + 端口 + 密钥
[manageservers]
172.16.1.180:22
[proxyservers]
172.16.1.18[1:2]:22
# 方式2:别名 + 主机 + 端口 + 密码
[webservers]
web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22
web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22
web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22
Ansible Facts 是 Ansible 在被托管主机上自动收集的变量。它是通过在执行 Ad-Hoc 以及 Playbook 时使用 setup 模块进行收集的,并且这个操作是默认的。
因为这个收集托管主机上的 Facts 比较耗费时间,所以可以在不需要的时候关闭 setup 模块。收集的 Facts 中包含了托管主机特有的信息,这些信息可以像变量一样在 Playbook 中使用。
收集的 Facts 中包含了以下常用的信息:
主机名、内核版本、网卡接口、IP 地址、操作系统版本、环境变量、CPU 核数、可用内存、可用磁盘 等等……。
使用场景:
获取指定受控端的 facts 信息
[yun@ansi-manager ansible_info]$ pwd
/app/ansible_info
[yun@ansi-manager ansible_info]$ ansible 172.16.1.181 -m setup -i ./hosts_key
172.16.1.181 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"10.0.0.181",
"172.16.1.181"
],
………………
如何在 playbook 中关闭 facts
[yun@ansi-manager object03]$ pwd
/app/ansible_info/object03
[yun@ansi-manager object03]$ cat test_facts.yml
---
# facts 使用
- hosts: proxyservers
# 关闭 facts 变量
gather_facts: no
# 这时就不能取到 ansible_hostname、ansible_eth0.ipv4.address、ansible_eth1 ['ipv4']['address'] 变量信息
tasks:
- name: "get ansible facts var"
debug:
msg: "This host name is {{ ansible_hostname }} ,eth0: {{ ansible_eth0.ipv4.address }}, eth1: {{ ansible_eth1['ipv4']['address'] }}"
获取受控端的主机名,内网地址和外网地址
[yun@ansi-manager object03]$ pwd
/app/ansible_info/object03
[yun@ansi-manager object03]$ ll
total 4
-rw-rw-r-- 1 yun yun 241 Aug 22 10:41 test_facts.yml
[yun@ansi-manager object03]$ cat test_facts.yml
---
# facts 使用
- hosts: proxyservers
tasks:
- name: "get ansible facts var"
debug:
msg: "This host name is {{ ansible_hostname }} ,eth0: {{ ansible_eth0.ipv4.address }}, eth1: {{ ansible_eth1['ipv4']['address'] }}"
#### 上面写了两种方式引用变量,推荐使用后一种引用方式
[yun@ansi-manager object03]$ ansible-playbook -b -i ../hosts_key test_facts.yml
PLAY [proxyservers] ***********************************************************************************************
TASK [Gathering Facts] ********************************************************************************************
ok: [172.16.1.181]
ok: [172.16.1.182]
TASK [get ansible facts var] **************************************************************************************
ok: [172.16.1.181] => {
"msg": "This host name is ansi-haproxy01 ,eth0: 172.16.1.181, eth1: 10.0.0.181"
}
ok: [172.16.1.182] => {
"msg": "This host name is ansi-haproxy02 ,eth0: 172.16.1.182, eth1: 10.0.0.182"
}
PLAY RECAP ********************************************************************************************************
172.16.1.181 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.16.1.182 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
根据受控端主机名的不同,在受控端生成不同的配置文件
[yun@ansi-manager object03]$ pwd
/app/ansible_info/object03
[yun@ansi-manager object03]$ ll
total 32
drwxrwxr-x 2 yun yun 58 Aug 22 12:31 file
-rw-rw-r-- 1 yun yun 224 Aug 22 12:33 test_zabbix_agentd.yml
[yun@ansi-manager object03]$ cat file/vars_file.yml # playbook 变量
zabbix_server: 172.16.1.180
[yun@ansi-manager object03]$ cat file/zabbix_agentd_temp.conf.j2 # 模拟 zabbix_agentd 配置文件
# 模拟 zabbix_agentd 配置文件
# zabbix 服务端配置
Server={{ zabbix_server }}
ServerActive={{ zabbix_server }}
# zabbix 客户端配置
Hostname={{ ansible_hostname }}
[yun@ansi-manager object03]$ cat test_zabbix_agentd.yml # 具体的 yml 文件
---
# zabbix 配置
- hosts: proxyservers
vars_files: ./file/vars_file.yml
tasks:
- name: config zabbix_agentd
template:
src: ./file/zabbix_agentd_temp.conf.j2
dest: /tmp/zabbix_agentd_temp.conf
[yun@ansi-manager object03]$ ansible-playbook -b -i ../hosts_key --syntax-check test_zabbix_agentd.yml # 语法检测
[yun@ansi-manager object03]$ ansible-playbook -b -i ../hosts_key -C test_zabbix_agentd.yml # 预执行,测试执行
[yun@ansi-manager object03]$ ansible-playbook -b -i ../hosts_key test_zabbix_agentd.yml # 执行
受控端1配置文件查看
[yun@ansi-haproxy01 ~]$ cat /tmp/zabbix_agentd_temp.conf
# 模拟 zabbix_agentd 配置文件
# zabbix 服务端配置
Server=172.16.1.180
ServerActive=172.16.1.180
# zabbix 客户端配置
Hostname=ansi-haproxy01
受控端2配置文件查看
[yun@ansi-haproxy02 ~]$ cat /tmp/zabbix_agentd_temp.conf
# 模拟 zabbix_agentd 配置文件
# zabbix 服务端配置
Server=172.16.1.180
ServerActive=172.16.1.180
# zabbix 客户端配置
Hostname=ansi-haproxy02