1.Ansible variables 变量定义的方式
2.各种定义变量方式的优先级
3.变量注册
4.facts 变量
5.facts 优化
一、Ansible variables 变量定义的方式
以一个固定的字符串去表示一个不固定的值
1.在playbook文件中定义
- 通过vars 的方式
[root@manager ansible_variables]# cat var1.yml
- hosts: webservers
vars: #定义变量关键字
- web_packages: httpd
- ftp_packages: vsftpd
tasks:
- name: Installed Rpm Packages "{{ web_packages }}" "{{ ftp_packages }}"
yum :
name:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
state: present
- 通过vars_files 的方式
[root@manager ansible_variables]# cat var1.yml
- hosts: webservers
vars_files: ./test.yml #指向定义变量的文件,可以指定多个
tasks:
- name: Installed Rpm Packages "{{ web_packages }}" "{{ ftp_packages }}"
yum :
name:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
state: present
#创建文件,并定义变量
[root@manager ansible_variables]# cat test.yml
web_packages: httpd
ftp_packages: vsftpd
2.在定义主机清单的文件中定义变量(了解)
[root@manager ansible_variables]# cat hosts
[webservers]
172.16.1.7
172.16.1.8
[webservers:vars] #只能由webservers主机组,来使用变量
web_packages: httpd
ftp_packages: vsftpd
3.通过inventory在主机组或单个主机中定义变量(推荐)
首先需要在ansible配置的目录下,创建 host_vars 和 group_vars 两个目录
root@manager ansible_variables]# mkdir host_vars
[root@manager ansible_variables]# mkdir group_vars
#创建与主机组名称相同的文件,在其中定义变量,只有该主机组可以调用其变量,而 host_vars/172.16.1.7单个主机,这样就可以了
[root@manager ansible_variables]# cat group_vars/webservers
web_packages: wget
ftp_packages: tree
#编写playbook文件,直接应用变量
[root@manager ansible_variables]# cat var4.yml
- hosts: webservers
tasks:
- name: Install Rpm Packages "{{ web_packages }}" "{{ ftp_packages }}"
yum:
name:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
state: present
小结: 如果在group_vars目录下创建一个名称为 all 的文件,在其中定义变量,则所有的主机都可以使用定义的变量
4.通过命令行进行变量定义
[root@manager ansible_variables]# cat var6.yml
- hosts: webservers
tasks:
- name: Install Rpm Packages "{{ web_packages }}"
yum:
name:
- "{{ web_packages }}"
state: present
[root@manager ansible_variables]# ansible-playbook var6.yml -e "web_packages=httpd"
二、各种定义变量方式的优先级
| 优先级由高向下排列 |
|---|
| ①-e 外置传参,命令行 |
| ②vars_files |
| ③vars |
| ④host_vars |
| ⑤group_vars/webservers |
| ⑥group_vars/all |
三、变量注册
register关键字可以将某个task任务结果存储至变量中,最后使用debug输出变量内容,可以用于后续排查故障。
[root@manager ansible_variables]# cat var9.yml
- hosts: webservers
tasks:
- name: Get Network Status
shell: netstat -lntp
register: System_Net
#将shell命令的执行输出结果,存储至System_Net 变量中
- name: Print Variables
debug:
msg: "{{ System_Net }}"
#debug模块打印变量所有信息,变量后面可以加东西,
#例如加 "{{ System_Net.rc }}" ,可以获取想要看到的的信息
四、facts变量
自动采集,“被控端主机”自身的状态信息(例如主机名、IP地址、CPU数量等等)
#可以查找到需要用的facts变量
[root@manager ansible_variables]# ansible webserver -m setup
setup 获取状态信息
案例:根据IP地址生成不同的Redis配置
[root@manager ansible_variables]# cat redis.yml
- hosts: webservers
tasks:
- name: Installed Redis Server
yum:
name: redis
state: present
- name: Configure Redis Server
template:
src: ./redis.conf.j2
dest: /etc/redis.conf
notify: Restart Redis Server
- name: Started Redis Server
systemd:
name: redis
state: started
enabled: yes
handlers:
- name: Restart Redis Server
systemd:
name: redis
state: restarted
#在需要拷贝的配置文件进行修改
[root@manager ansible_variables]# cat redis.conf.j2
...
bind 127.0.0.1 {{ ansible_eth1.ipv4.address }}
...
五、facts优化
facts变量开启会影响playbook运行的效率, 但是关闭又会造成无法提取被控端的状态。
为解决这一问题需要使用缓存,缓存facts变量,redis的方法
#python需要安装redis服务
[root@manager ansible_variables]# yum install python-pip -y
[root@manager ansible_variables]# pip install redis
#在ansible配置文件ansible.cfg中修改
[root@manager ansible_variables]# cat ansible.cfg
[defaults]
inventory = ./hosts
#开启redis缓存
gathering = smart
fact_caching_timeout = 86400
fact_caching = redis
fact_caching_connection = 172.16.1.7:6379








网友评论