Ansible Facts变量
目录
Ansible Facts是什么
查看Facts变量
剧本中使用facts变量
Ansible中的自定义变量
Ansible变量测试
-
Ansible Facts是什么
- facts组件是Ansible用于采集被管理机器设备信息的一个功能
- 用于采集的被控节点的设备信息
- 主要包含IP地址、操作系统、以太网设备、mac 地址、时间/日期相关数据,硬件信息等
- facts变量可以理解为Ansible中的预定义变量
- facts对我们是很有帮助的,省去了我们好多工作,大大提高了工作效率
-
查看Facts变量
- 使用setup模块,用于获取所有facts信息
## 常用参数
filter:用于过滤指定信息
## 样例
# 通过setup模块查看所有facts信息
[root@pubserver ~]# cd /root/ansible/
[root@pubserver ansible]# ansible webservers -m setup
# facts变量是一个大的由{}构成的键值对字典
# 在{}中,有很多层级的嵌套。可以通过参数过滤出第一个层级的内容
[root@pubserver ansible]# ansible webservers -m setup -a "filter=ansible_all_ipv4_addresses"
[root@pubserver ansible]# ansible webservers -m setup -a "filter=ansible_bios_version"
[root@pubserver ansible]# ansible webservers -m setup -a "filter=ansible_memtotal_mb"
[root@pubserver ansible]# ansible webservers -m setup -a "filter=ansible_hostname"
[root@pubserver ansible]# ansible webservers -m setup -a "filter=ansible_mem*"
-
剧本中使用facts变量
- 剧本中可以使用debug模块打印变量信息
- 剧本中默认有Gathering Facts的任务,收集到Facts信息后可以使用该模块打印
- 剧本中调用变量格式:{{ 变量名 }}
## 常用参数
msg:打印变量值,格式为:{{ 变量名 }}
var:打印变量值,格式为:变量名
## 样例
# 命令行
[root@pubserver ansible]# ansible webservers -m debug #默认返回值为"Hello World!"
# 剧本
[root@pubserver ansible]# vim debug1.yml
---
- name: test debug
hosts: webservers
tasks:
- name: test debug msg
debug:
msg: "hostname: {{ ansible_hostname }}; mem: {{ ansible_memtotal_mb }}"
[root@pubserver ansible]# ansible-playbook debug1.yml
#扩展用法
[root@pubserver ansible]# vim debug2.yml
---
- name: test debug
hosts: webservers
tasks:
- name: test debug var
debug:
var: ansible_hostname, ansible_bios_version
[root@pubserver ansible]# ansible-playbook debug2.yml
Ansible中的自定义变量
通过变量的使用可以让剧本更加灵活,多次运行剧本的时候只需要调整变量名即可
Ansible支持十几种变量定义方式
Ansible变量定义的位置,下列变量优先级从低到高
- role defaults :roles defaults目录下的变量
- inventory vars:inventory文件中定义的变量
- inventory group_vars:inventory文件组的变量
- inventory host_vars:inventory文件主机的变量
- playbook group_vars:剧本中组的变量
- playbook host_vars:剧本中主机的变量
- host facts:事实变量
- play vars:vars定义的变量
- play vars_prompt:vars_prompt定义的变量
- play vars_files:vars_files导入的变量
- registered vars:注册变量
- role and include vars:roles中单独定义的及导入的变量
- block vars (only for tasks in block):block中定义的变量
- task vars (only for the task):任务中定义的变量
- extra vars (always win precedence):命令行指定的变量
Ansible变量测试
- 主机清单变量
## 在inventory文件中定义变量
# 主机变量
[root@pubserver ansible]# vim inventory
[webservers]
web[1:2]
[dbs]
db1 username="liubei" #定义属于db1主机的变量
[cluster:children]
webservers
dbs
[root@pubserver ansible]# vim var1.yml
---
- name: create user with host vars
hosts: db1
tasks:
- name: test host vars
user:
name: "{{ username }}"
state: present
[root@pubserver ansible]# ansible-playbook var1.yml #运行剧本
[root@pubserver ansible]# ansible db1 -a "id liubei" #测试结果
db1 | CHANGED | rc=0 >>
uid=1000(liubei) gid=1000(liubei) groups=1000(liubei)
[root@pubserver ansible]#
# 组变量
[root@pubserver ansible]# vim inventory
[webservers]
web[1:2]
[dbs]
db1 username="liubei"
[cluster:children]
webservers
dbs
[webservers:vars] #定义属于组的变量,:vars是固定格式
username="guanyu"
[root@pubserver ansible]# vim var2.yml
---
- name: create user with group vars
hosts: webservers
tasks:
- name: test group vars
user:
name: "{{ username }}"
state: present
[root@pubserver ansible]# ansible-playbook var2.yml #运行剧本
[root@pubserver ansible]# ansible webservers -a "id guanyu" #验证结果
web1 | CHANGED | rc=0 >>
uid=1041(guanyu) gid=1041(guanyu) groups=1041(guanyu)
web2 | CHANGED | rc=0 >>
uid=1041(guanyu) gid=1041(guanyu) groups=1041(guanyu)
- 剧本变量
## 在Playbook中定义变量
# 变量矩阵
[root@pubserver ansible]# vim var3.yml
---
- name: create user with play vars
hosts: webservers
vars: #剧本中定义变量
username: "zhangfei" #定义变量
password: "123456" #定义变量,数字作为密码必须用引号,表示字符串
tasks:
- name: test play vars
user:
name: "{{ username }}"
password: "{{ password|password_hash('sha512')}}"
state: present
[root@pubserver ansible]# ansible-playbook var3.yml
# 变量文件
[root@pubserver ansible]# vim fvars.yml
---
username: "lvbu"
password: "654321"
[root@pubserver ansible]# vim var4.yml
---
- name: create user with vars files
hosts: webservers
vars_files: fvars.yml #调用定义变量的文件
tasks:
- name: test vars file
user:
name: "{{ username }}"
password: "{{ password | password_hash('sha512')}}"
state: present
[root@pubserver ansible]# ansible-playbook var4.yml #运行剧本
[root@pubserver ansible]# ansible webservers -a "id lvbu" #验证结果
web2 | CHANGED | rc=0 >>
uid=1043(lvbu) gid=1043(lvbu) groups=1043(lvbu)
web1 | CHANGED | rc=0 >>
uid=1043(lvbu) gid=1043(lvbu) groups=1043(lvbu)
- Facts变量
## 调用Facts变量
# 一定要开启Facts信息收集,gather_facts: yes
[root@pubserver ansible]# vim var5.yml
---
- name: copy file with facts
hosts: webservers
tasks:
- name: use facts
copy:
content: "hostname: {{ ansible_hostname }}\nbios_version: {{ ansible_bios_version }}"
dest: /tmp/facts.txt
[root@pubserver ansible]# ansible-playbook var5.yml
[root@pubserver ansible]# ansible webservers -a "cat /tmp/facts.txt"
web2 | CHANGED | rc=0 >>
hostname: web2
bios_version: rel-1.15.0-0-g2dd4b9b3f840-prebuilt.qemu.org
web1 | CHANGED | rc=0 >>
hostname: web1
bios_version: rel-1.15.0-0-g2dd4b9b3f840-prebuilt.qemu.org