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 testhosts: webvars:user: studenthome: /home/student#在文件中定义,写入playbook中
- name: file's varvars_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 testhosts: allvars: ###以数组的方式进行定义users:lilei:firstname: leilastname: lihomedir: /home/lilei
上述变量的定义均以字典的方式进行定义的,关键字:值 (关键字为变量名称,值为变量所附的值)
4、变量的调用
4.1 常规调用
#定义变量
vars:user: student
#任务中的调用tasks:- name: Create user {{ user }}debug: msg="The var is {{ user }}"
4.2 数组方式时的调用
#伪代码,只展示数组方式的调用
--... tasks:- name: debugdebug: msg="This var is {{ users['lilei'] }}" ##以递归的方式进行调用
# debug: msg= "This var is {{ users.lilei }}" ##以字典的方式调用...
【注】当代码是以变量开头时,必须以 “{{}}”格式调用。
5、整体模块练习
配置Apache服务的默认发布页
1 ---2 - name: Installed Apache3 hosts: all4 vars: ###变量编写5 web_pkg: httpd6 firewall_pkg: firewalld7 web_service: httpd8 firewall_service: firewalld9 python_pkg: python10 rule: http11 tasks: ##执行任务12 - name: Required packages are installed13 yum: ##安装对应的软件包14 name:15 - "{{ web_pkg }}"16 - "{{ firewall_pkg }}"17 - "{{ python_pkg }}"18 state: latest19 - name: The {{ web_pkg }} service is start ##开启网络服务20 service:21 name: "{{ web_pkg }}"22 state: started23 enabled: true24 - name: The {{firewall_pkg }} service is start ##开启火墙服务25 service:26 name: "{{ firewall_pkg }}"27 state: started28 enabled: true29 - 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: true37 immediate: true38 state: enabled39 - name: Veritfy the Apache service ##当前主机检测40 hosts: localhost41 become: false42 tasks:43 - name: Ensre the web service44 uri:45 url: http://servera.linux.com46 status_code: 20047 48 ...
结果:登录servera 查看目录文件


















