1、变量使用的原因
playbook的编写是使用yml的语法,虽然该语法规则较为简单,但是,同其他语法相同该语法也有变量、循环等机制的使用。变量的使用就是为了提高我们所写剧本的复用性(当某个参数更改时,直接更改变量的赋值,无需更改剧本中的每一处),从而提高工作效率。
2、变量定义的范围及优先级
2.1 变量的范围:
1、 全局范围: 在名两行设置的ansible的变量值
2、 playbook范围:在playbook和相关文件中设置的变量
3、 主机范围: 由清单、事实手机或注册的任务,在相应的主机中生效
主机变量分为:
2.1.3.1 主机变量,应用于特定主机
2.1.3.2 组变量,应用于一个主机组或者一组主机组中的所有主机
2.2 变量的优先级:
在定义多级别变量下,变量范围窄的‘窄的’优先级高于 ‘广泛’的,其中主机变量优先于组变量;playbook范围下的优先级最高。
3、变量的定义方式
3.1 变量的命名方式
变量在定义时可含有:数字、字母、下换线,但数字下划线不能开头;
3.2 常见方式的定义
#playbook中直接定义
- name: var test
hosts: web
vars:
user: student
home: /home/student
#在文件中定义,写入playbook中
- name: file's var
vars_files: ## 变量写入文件即可
- users.yml
3.3 主机变量的定义:
#定义主机变量
[servera]
servera.linux.com ansible_user_var=student ##直接跟在主机后,以字典的方式定义
#定义主机组变量
[serverb]
serverb.linux.com
serverb.redhat.com
[serverb:vars] ##先定义主机组,在写组的同时添加变量标识
user=student ##在该组标识下以字典方式定义
在定义主机组时,也可以嵌套的方式定义
#编写主机组
[group1]
group1.linux.com
[group2]
group2.example.com
[group:children]
group1
group2
#嵌套变量定义
[group:vars] ##用var进行标识
user=studen ##以字典方式定义
在定义变量组时,我们会发下上述方法的定义会使inventory清单变得混乱,所以现在常采用的放法是以文件的方式进行定义,然后直接调用(该变量清单需要和inventory清单在同一级别,且名称需要相互匹配),主机变量清单的名称为:host_vars ;主机组变量清单的名称为: group_vars/groupname:
#主机变量结构
[root@contral var]# tree .
.
├── ansible.cfg
├── group_var ##主机组变量
│ └── servers
├── host_var ##主机变量
├── inventory
3.4 以数组的方式进行定义:
---
- name: iteration test
hosts: all
vars: ###以数组的方式进行定义
users:
lilei:
firstname: lei
lastname: li
homedir: /home/lilei
上述变量的定义均以字典的方式进行定义的,关键字:值 (关键字为变量名称,值为变量所附的值)
4、变量的调用
4.1 常规调用
#定义变量
vars:
user: student
#任务中的调用
tasks:
- name: Create user {{ user }}
debug: msg="The var is {{ user }}"
4.2 数组方式时的调用
#伪代码,只展示数组方式的调用
--
...
tasks:
- name: debug
debug: msg="This var is {{ users['lilei'] }}" ##以递归的方式进行调用
# debug: msg= "This var is {{ users.lilei }}" ##以字典的方式调用
...
【注】当代码是以变量开头时,必须以 “{{}}”格式调用。
5、整体模块练习
配置Apache服务的默认发布页
1 ---
2 - name: Installed Apache
3 hosts: all
4 vars: ###变量编写
5 web_pkg: httpd
6 firewall_pkg: firewalld
7 web_service: httpd
8 firewall_service: firewalld
9 python_pkg: python
10 rule: http
11 tasks: ##执行任务
12 - name: Required packages are installed
13 yum: ##安装对应的软件包
14 name:
15 - "{{ web_pkg }}"
16 - "{{ firewall_pkg }}"
17 - "{{ python_pkg }}"
18 state: latest
19 - name: The {{ web_pkg }} service is start ##开启网络服务
20 service:
21 name: "{{ web_pkg }}"
22 state: started
23 enabled: true
24 - name: The {{firewall_pkg }} service is start ##开启火墙服务
25 service:
26 name: "{{ firewall_pkg }}"
27 state: started
28 enabled: true
29 - name: Web content is in place ##修改注默认发布页
30 copy:
31 content: "HELLOW LINUX!!!" ##输入内容
32 dest: /var/www/html/index.html ##目的地
33 - name: The firewall port for {{ rule }} ##配置火墙服务
34 firewalld:
35 service: "{{ rule }}"
36 permanent: true
37 immediate: true
38 state: enabled
39 - name: Veritfy the Apache service ##当前主机检测
40 hosts: localhost
41 become: false
42 tasks:
43 - name: Ensre the web service
44 uri:
45 url: http://servera.linux.com
46 status_code: 200
47
48 ...
结果:登录servera 查看目录文件