⾃动化运维利器Ansible-变量
- 一、变量命名规则
- 二、变量的类型
- 2.1 全局变量
- 2.3 剧本变量
- 2.4 资产变量
- 2.5 facts变量
- 2.6 注册变量
- 三、变量的优先级
按顺序食用,口味更佳
( 1 ) ⾃动化运维利器Ansible-基础
( 2 ) ⾃动化运维利器 Ansible-Playbook
( 3 ) ⾃动化运维利器 Ansible-变量
( 4 ) ⾃动化运维利器AnsiblePlaybook的任务控制
( 5 ) ⾃动化运维利器 Ansible-Jinja2
( 6 ) ⾃动化运维利器 Ansible-最佳实战
ansible作为一门特殊的语言,肯定要涉及到变量定义、控制结构的使⽤等特性。
一、变量命名规则
变量的名字由字母、下划线和数字组成,必须以字⺟开头。保留关键字不能作为变量名称,具体关键字比较多,不在列举。
正确的变量命名: aimyon_36,ztmy_1
错误的变量命名:_aaa ,2_bb
二、变量的类型
根据变量的作⽤范围⼤体的将变量分为:
- 全局变量
- 剧本变量
- 资产变量
2.1 全局变量
全局变量,使⽤ansible 或使⽤ansible-playbook 时,手动通过 -e 参数传递给Ansible 的变量。
通过ansible 或 ansible-playbook 的 help 帮助, 可以获取具体格式使⽤⽅式:
ansible -h | grep var
-e EXTRA_VARS,
--extra-vars=EXTRA_VARS set additional variables as key=value or YAML/JSON
ansible-playbook -h | grep var
-e EXTRA_VARS,
--extra-vars=EXTRA_VARS set additional variables as key=value or YAML/JSON
上述的help比较难懂,通过下边的举例说明。
传统的kv形式
ansible all -i localhost, -m debug \
-a "msg='my key is {{ key }}'" -e "key=value"
传递YAML/JSON的形式
cat a.json
{"name":"qfedu","type":"school"}
ansible all -i localhost, -m debug \
-a "msg='name is {{ name }}, type is {{ type }}'" -e @a.json
2.3 剧本变量
该种变量和playbook有关,定义在playbook中。
通过PLAY属性vars定义:
---
- name: test play vars
hosts: all
vars:
user: lilei
home: /home/lilei
tasks:
- name: create the user {{ user }}
user:
name: "{{ user }}"
home: "{{ home }}"
通过PLAY属性vars_files定义:
---
- name: test play vars
hosts: all
vars_files:
- vars/users.yml
cat vars/users.yml
---
user: lilei
home: /home/lilei
...
当需要定义的变量很多时,使用vars属性定义会显得很臃肿,此时可以将变量抽取出来形成单独的YAML文件。
2.4 资产变量
ansible中的资产分为静态资产和动态资产,资产变量就是和资产紧密相关的一种变量。
资产变量分为主机变量和主机组变量,分别针对资产中的单个主机和主机组。
主机组变量:
以下资产中,定义了⼀个组变量home ,此变量将针对webservers 这个主机组中的所有服务器有效。
cat hostsandgroupvars
[webservers]
172.18.0.3 user=lilei
172.18.0.4
[webservers:vars] //home 是 web_servers 的组变量,会针对这个组内的所有服务器⽣效。
home="/home/lilei"
ansible webservers -i hostsandgroupvars -m debug -a "var=home"
172.18.0.3 | SUCCESS => {
"home": "/home/lilei"
}
172.18.0.4 | SUCCESS => {
"home": "/home/lilei"
}
主机变量 VS 主机组变量
当主机变量和组变量在同⼀个资产中发⽣重名的情况,会有什么效果呢?
cat hosts_v2
[webservers]
172.18.0.3 user=lilei //主机变量
172.18.0.4
[webservers:vars] //组变量
user=tom
ansible webservers -i hosts_v2 -m debug -a "var=user"
172.18.0.3 | SUCCESS => {
"user": "lilei"
}
172.18.0.4 | SUCCESS => {
"user": "tom"
}
在资产中定义了主机变量和组变量 user, 此时发现 172.18.0.3这台机器的主机变量 user 的优先级更⾼。
变量的继承
在介绍资产时说过资产的继承,那么变量是否也存在继承关系呢?
cat hosts_v3
[webservers]
172.18.0.3
[dbservers]
172.18.0.4
[allservers]
[allservers:children]
dbservers
webservers
[allservers:vars]
user=lilei
webservers和dbservers作为allservers的子类,子类会继承父类的变量,父类的变量属于组变量,因此主机变量优先级会更高。
2.5 facts变量
Facts变量不包含在前⽂中介绍的全局变量、剧本变量及资产变量之内。
Facts变量不需要我们⼈为去声明变量名及赋值。
它的声明和赋值完全有Ansible 中的 setup 模块帮我们完成。它收集了有关被管理服务器的操作系统版本、服务器IP地址、主机名,磁盘的使⽤情况、CPU个数、内存⼤⼩等等有关被管理服务器的私有信息。
在每次PlayBook运⾏的时候都会发现在PlayBook执⾏前都会有⼀个Gathering Facts的过程。这个过程就是收集被管理服务器的Facts信息过程。
⼿动收集Facts 变量
ansible all -i localhost, -c local -m setup
过滤Facts
Facts手动收集到的信息量很大,因此需要使用fileter操作对信息进行过滤。
仅获取服务器的内存情况信息
ansible all -i localhost, -m setup -a "filter=*memory*" -c local
localhost | SUCCESS => {
"ansible_facts": {
"ansible_memory_mb": {
"nocache": {
"free": 508,
"used": 473
},
"real": {
"free": 59,
"total": 981,
"used": 922
},
"swap": {
"cached": 0,
"free": 1981,
"total": 1983,
"used": 2
}
}
},
"changed": false
}
默认情况下,在执⾏PlayBook的时候,它会去⾃动的获取每台被管理服务器的facts信息。
若在整个PlayBook 的执⾏过程中,完全未使⽤过 Facts 变量,此时我们可以将其关闭,以加快PlayBook的执⾏速度。
---
- name: a play example
hosts: webservers
# 关闭 facts 变量收集功能
gather_facts: no
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=present
- name: copy nginx.conf to remote server
copy: src=nginx.conf
dest=/etc/nginx/nginx.conf
- name: start nginx server
service:
name: nginx
enabled: true
state: started
2.6 注册变量
注册变量往往⽤于保存⼀个task任务的执⾏结果, 以便于debug时使⽤。或者将此次task任务的结果作为条件,去判断是否去执⾏其他task任务。注册变量在PlayBook中通过register关键字去实现。
Playbook:
---
- name: install a package and print the result
hosts: webservers
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=present
register: install_result
- name: print result
debug: var=install_result
执行结果:
ok: [172.18.0.4] => {
"install_result": {
"changed": false,
"failed": false,
"msg": "",
"rc": 0,
"results": [
"1:nginx-1.16.1-1.el7.ngx.x86_64
providing nginx is already installed"
]
}
}
三、变量的优先级
⽬前介绍了全局变量、剧本变量、资产变量、Facts变量及注册变量。
- Facts变量不需要⼈为去声明、赋值;
- 注册变量只需通过关键字register去声明,⽽不需要赋值。
- 全局变量、剧本变量及资产变量则完全需要⼈为的去声明、赋值。
此处不在介绍变量优先级的验证过程,直接说明优先级关系。
全局变量的定义
ansible-playbook -i hosts priority.yml -e "user=www"
剧本变量的定义
---
- name: test variable priority
hosts: all
remote_user: root
vars:
user: mysql
tasks:
- name: print the user value
debug: msg='the user value is {{ user }}'
资本变量的定义
[dbservers]
172.18.0.3
[webservers]
172.18.0.4 ansible_ssh_port=2222
[allservers:children]
dbservers
webservers
[allservers:vars]
user=tomcat
当⼀个变量同时在全局变量、剧本变量和资产变量中定义时,优先级最⾼的是全局变量;其次是剧本变量;最后才是资产变量。
按顺序食用,口味更佳
( 1 ) ⾃动化运维利器Ansible-基础
( 2 ) ⾃动化运维利器 Ansible-Playbook
( 3 ) ⾃动化运维利器 Ansible-变量
( 4 ) ⾃动化运维利器AnsiblePlaybook的任务控制
( 5 ) ⾃动化运维利器 Ansible-Jinja2
( 6 ) ⾃动化运维利器 Ansible-最佳实战