4.自动化运维工具Ansible之变量
孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。
1.变量概述
变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如 nginx‐1.20 这个软件包的版本,在其它地方或许会反复使用,那么如果讲此值设置为变量,然后再在其他的playbook中调用,会方便许多。如此一来还方便维护,减少维护的成本。
1.定义变量的方式
1.通过命令行进行变量定义
2.在play文件中进行变量定义
3.通过Inventory主机信息文件中进行变量定义
2.变量的优先级
如果在定义变量时,变量冲突了
在上述的三个地方分别设置了:
1.命令行中:age=11
2.play文件中:age=12
3.Inventory中:age=13
那么,最终的age结果一定是11
变量的读取优先级为:命令行 > playbook文件 > Inventory文件
2.变量定义
1.playbook中vars定义变量
方法一:
[root@mb01 ~]# cat /server/playbook/yum.yml
---
- name: 安装卸载软件
vars:
- soft: tree
- soft1: cowsay
hosts: 172.16.1.7
tasks:
- name: 安装软件 "{{ soft }}" "{{ soft1 }}"
yum:
name:
- "{{ soft }}"
- "{{ soft1 }}"
state: installed
方法二:
[root@mb01 ~]# cat /server/playbook/yum.yml
---
- name: 安装卸载软件
vars:
soft:
- nfs-utils
- rpcbind
hosts: 172.16.1.7
tasks:
- name: 安装{{ soft }}
yum:
name: "{{ soft }}"
state: installed
2.使用Ansible内置变量
[root@mb01 ~]# cat /server/playbook/touch.yml
---
- name: 创建文件
hosts: webs
tasks:
- name: 开始创建文件
file:
path: /opt/{{ ansible_default_ipv4['address'] }}[1-10].txt
state: touch
3.使用vars_file定义变量(也算是在playbook定义)
刚才我们学到在playbook中使用 vars 定义变量,有一个缺陷,就是其他的playbook无法使用该变量。所以我们可以采 取第二种定义变量的方式,在 vars_file 中定义变量。
#定义阶段
[root@mb01 ~]# cat /server/playbook/vars/01_vars.yml
soft:
- cowsay
- tree
- vim
#调用阶段
[root@mb01 ~]# cat /server/playbook/yum.yml
---
- name: 安装卸载软件
vars_files:
- /server/playbook/vars/01_vars.yml
hosts: 172.16.1.7
tasks:
- name: 安装"{{ soft }}"
yum:
name: "{{ soft }}"
state: installed
注意: 什么时候变量加上双引号 {{ ansible_facts }} 如果变量是开头的时候 加上双引号 "{{ sfy }}/a/b/c/cd/"
4.在Inventory中定义变量
注意:在Inventory中定义变量,主机的变量要高于主机组的变量,所以该方法不推荐使用,容易将环境弄乱。
#定义阶段
[root@mb01 ~]# cat /etc/ansible/hosts
[webs]
172.16.1.7
172.16.1.8
[nfs]
172.16.1.51
[backup]
172.16.1.41
[webs:vars]
filename=nginx
#调用阶段
[root@mb01 ~]# cat /server/playbook/touch.yml
---
- name: 创建文件
hosts: webs
tasks:
- name: 开始创建文件
file:
path: /opt/{{ filename }}.txt
state: touch
5.通过命令行覆盖变量
inventory的变量会被playbook文件中覆盖,这两种方式的变量都会被命令行直接指定变量所覆盖。使用--extra-vars或-e 设定变量
[root@mb01 ~]# ansible-playbook ceshi.yml -e "file_name=sfy"
3.官方推荐变量定义
1.主机组定义变量
#定义阶段#group_vars目录下必须存放和inventory清单文件中定义的组名一致
[root@mb01 ~]#cat /server/playbook/group_vars/webs##文件名与hosts文件主机组名一致
filennn: 123
filenames: sss
#调用阶段
[root@mb01 ~]# cat /server/playbook/touch.yml
---
- name: 创建文件
hosts: webs
tasks:
- name: 开始创建文件
file:
path: /opt/"{{ filenames }}".txt
state: touch
#注意:系统提供了特殊的all组,也就说在group_vars目录下创建一个all文件,定义变量对所有的主机都生效
2.主机定义变量
#定义阶段
[root@mb01 ~]# cat /server/playbook/group_vars/webs
filennn: 123
filenames: sss
web_server: httpd
[root@mb01 ~]# cat /server/playbook/host_vars/172.16.1.7
web_server: nginx
#调用阶段
[root@mb01 ~]# cat /server/playbook/touch.yml
---
- name: 安装软件
hosts: webs
tasks:
- name: 开始安装{{ web_server }}
yum:
name: "{{ web_server }}"
state: installed
####注意执行后发下调用的变量是nginx,即主机变量优先于主机组
#命令行变量--->play中的vars_files--->play中的vars变量-->host_vars中定义的变量--->group_vars/组--->group_vars/all
-> 低
3.变量支持层级定义,使用"."会有问题,建议使用"[]"代替
#定义阶段
[root@m01 ~]# cat vars_file.yml
lamp:
web:
web_package: httpd
db_package: mariadb-server
php_package: php
#调用阶段
[root@mb01 ~]# cat test.yml
---
- hosts: all
vars_files:
- vars_file.yml
tasks:
- name: Installed httpd
yum: name={{ lamp['web']['web_package'] }}
- name: Install Mariadb
yum: name={{ lamp.web.db_package }}
4.变量注册
当 absible 的模块在运行之后,其实都会返回一些 result 结果,就像是执行脚本,我们有的时候需要脚本给我们一些 return 返回值,我们才知道,上一步是否可以执行成功,但是…默认情况下, ansible 的 result 并不会显示出来,所 以,我们可以把这些返回值’存储’到变量中,这样我们就能通过’调用’对应的变量名,从而获取到这些 result ,这种将模块的返回值,写入到变量中的方法被称为变量注册
[root@mb01 ~]# cat /server/playbook/zhuce.yml
---
- name: ceshi register
hosts: 172.16.1.7
tasks:
- name: 拷贝配置文件
copy:
src: /server/playbook/exports
dest: /opt
notify: 重载nginx
- name: 查看nginx的状态
shell: systemctl status nginx
register: nx####################将上一个命令执行的结果赋值给nx
ignore_errors: yes
- name: 查看status状态
debug:
msg: "{{ nx }}"##############调用nx的值
5.facts变量
Ansible facts是在被管理追击上通过Ansible自动采集发现的变量。 facts 包含每台特定的主机信息。比如:被控端的主 机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等。
1.facts使用场景
1.通过 facts 缓存检查CPU,来生成对应的nginx配置文件
2.通过 facts 缓存检查主机名,生成不同的zabbix配置文件
3.通过 facts 缓存检索物理机的内存大小来生成不通的mysql配置文件
综上所述的Ansible facts类似于 saltstack 中的 grains 对于做自动化的小伙伴是非常有用滴。
2.facts基本用法
1显示所有 ansible facts
[root@mb01 ~]# ansible localhost -i hosts -m setup
Facts获取被控端主机名与ip地址,然后通过debug输出。
2.直接调用
[root@mb01 ~]# cat /server/playbook/get.ip.host.yml
---
- name: 获取ip和host名
hosts: webs
tasks:
- name: 获取ip
debug:
msg:
- this is "{{ ansible_all_ipv4_addresses }}"
- this id "{{ ansible_fqdn }}"
- hoh "{{ ansible_python.version_info.0 }}"
3.facts开启后会影响Ansible主机的性能,如果没有采集被控端主机需求可选择关闭
[root@mb01 ~]# cat /server/playbook/get.ip.host.yml
---
- name: 获取ip和host名
gather_facts: no####注意,此参数加上后将不获取fast变量,下面调用的将失效
hosts: webs
tasks:
- name: 获取ip
debug:
msg:
- this is "{{ ansible_all_ipv4_addresses }}"#####失效
- this id "{{ ansible_fqdn }}" ########失效
- hoh "{{ ansible_python.version_info.0 }}"#失效
##########注意,变量可以加减乘除
[root@mb01 ~]# vim /server/playbook/get.ip.host.yml
---
- name: 获取ip和host名
# gather_facts: no
hosts: webs
tasks:
- name: 获取ip
debug:
msg:
- this is "{{ ansible_all_ipv4_addresses }}"
- this id "{{ ansible_fqdn }}"
- hoh "{{ ansible_python.version_info.0 +1 }}"#####此处+1#注意,/会显示小数点,去掉小数点用//来除
3.fasts变量优化(缓存)
[root@mb01 ~]# cat ansible.cfg
[defaults]
gathering = smart
fact_caching_timeout = 86400
fact_caching = redis
fact_caching_connection = 127.0.0.1:6379
# smart 表示默认收集facts,但facts已有的情况下不会收集,即使用缓存facts
# implicit表示默认收集facts,要禁止收集,必须使用gather_facts: False;
# explicit 则表示默认不收集,要显示收集,必须使用gather_facts: Ture.
#若Redis设置了密码
#fact_caching_connection = localhost:6379:0:admin
评论已关闭