⾃动化运维利器 Ansible-变量

⾃动化运维利器Ansible-变量

按顺序食用,口味更佳

( 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 帮助, 可以获取具体格式使⽤⽅式:

yaml 复制代码
 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形式

bash 复制代码
 ansible all -i localhost, -m debug \
 -a "msg='my key is {{ key }}'" -e "key=value"

传递YAML/JSON的形式

bash 复制代码
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定义:

yaml 复制代码
---
- 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定义:

yaml 复制代码
---
- 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 这个主机组中的所有服务器有效。

bash 复制代码
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 主机组变量

当主机变量和组变量在同⼀个资产中发⽣重名的情况,会有什么效果呢?

bash 复制代码
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 的优先级更⾼。

变量的继承

在介绍资产时说过资产的继承,那么变量是否也存在继承关系呢?

bash 复制代码
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 变量

bash 复制代码
ansible all -i localhost, -c local -m setup

过滤Facts

Facts手动收集到的信息量很大,因此需要使用fileter操作对信息进行过滤。
仅获取服务器的内存情况信息

bash 复制代码
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的执⾏速度。

bash 复制代码
---
- 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:

yaml 复制代码
---
- 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

执行结果:

bash 复制代码
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去声明,⽽不需要赋值。
  • 全局变量、剧本变量及资产变量则完全需要⼈为的去声明、赋值。

此处不在介绍变量优先级的验证过程,直接说明优先级关系。

全局变量的定义

bash 复制代码
ansible-playbook -i hosts priority.yml -e "user=www"

剧本变量的定义

yaml 复制代码
---
- 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 }}'

资本变量的定义

bash 复制代码
[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-最佳实战

相关推荐
悠然南风2 小时前
Ansible常见模块总结及LDAP Role 编写与调试
ansible
荣--9 小时前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森10 小时前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜1 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB2 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode3 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220704 天前
如何搭建本地yum源(上)
运维
大树887 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠7 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质7 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务