annan 2019-11-30
这个roles主要是将已知的文件结构预先是由roles定义好的,它会自动的加载这里面的文件内容,例如任务handlers,都会自动去加载,也就是roles对已知的进行分类分组,使我们很容易的去管理,roles提供一种层次化和结次化组织你的playbook,这也是我们去使用它的目的,它不像playbook是一个具体的使用,而roles它是一个组织的方式,这种方式也是通过ansible的一个最佳实践。
1. roles的目录结构
它在目录下有个site,yaml,这个是一个统一的入口,因为它会关联很多的文件,所以我们只需要对着这个统一的入口进行操作 另外就是角色或者功能模块进行部署,像下面的webservers.yaml和fooservers.yml
site.yml 统一的入口,会关联很多的文件
webservers.yml 角色或者功能模块进行部署
fooservers.yml hosts 角色或者功能模块进行部署
roles/ 角色目录,下面又分为不同的模块
common/ 像common 和webservers,相当于两个模块,common用于存放一些公共资源的地方,例如可能会有很多的项目会用到共同的变量,或者有相同的依赖,那么都可以在common的这模块下去定义,这个模块也可以称为角色,这个角色下面还有很多的目录,像下面的文件都是属于它的目录,这些目录就是区别不同的文件或者不同的任务
files/ 这个是角色部署时用到的文件,例如安装一个包,安装一个软件可能会用到它的一个包,那么这个包可以放在这个位置,
templates/ 这个是它角色部署时用到的模版,例如jinja渲染一个配置文件,这里存放一些动态生成文件的,而其他文件的一个目录,
tasks/ 任务,具体要做哪些事
handlers/ 处理程序
vars/ 角色的变量
defaults/ 角色的默认变量
meta/ 角色定义的一些元数据
webservers/ 跟上面的common一样属于模块,下面是所属的文件
files/。 角色部署时用到的文件
templates/ 角色部署时用到的模版
tasks/ 任务,具体要做哪些事
handlers/ 处理程序
vars/ 定义的变量
2. Roles的基本使用
定义角色来定义变量,
这里我们创建了hosts,这个我们的主机清单,roles需要放我们的模块以及不同任务的目录,要有一个site.yaml
[ roles-demo]# ls hosts roles site.yaml [ roles-demo]# mkdir roles/{common,nginx,php}/{file,templates,tasks,handlers}
在每个tasks下面都写一个main的yaml,因为它会在你的task下找这个main,也就是这个tasks下的一个入口
查看目录树结构
[ roles-demo]# tree . . |-- hosts |-- roles | |-- common | | |-- file | | |-- handlers | | |-- tasks | | | -- main.yaml | | -- templates | |-- nginx | | |-- file | | |-- handlers | | |-- tasks | | | -- main.yaml | | -- templates | -- php | |-- file | |-- handlers | |-- main.yaml | |-- tasks | -- templates - site.yaml
检查语法,执行[ roles-demo]# ansible-playbook site.yaml -i hosts --syntax-check
[ roles-demo]# ansible-playbook site.yaml -i hosts
在site下去定义新的调用的变量这个会找目录下对应的任务比如tasks下的任务
--- - hosts: webservers gather_facts: no remote_user: root roles: - role: common - role: nginx vars: dir: /opt/a app_port: 80 - role: php vars: dir: /opt/b app_port: 81
在tasks下面去定义任务这个会找site.yaml下面的roles,然后执行相关目录下面的操作
[ nginx]# cat tasks/main.yaml - name: nginx task test debug: msg="nginx task test > {{dir}} {{app_port}}"
也可以写一个组,在组里面去定义变量,这个all会帮你交给所有组,也可以定义webservers,就是定义单一这个组
[ roles-demo]# ls group_vars hosts roles site.yaml [ roles-demo]# cd group_vars/ [ group_vars]# ls all [ group_vars]# cat all nginx_ver: 1.15 php_ver: 5.6
如果单一给这个site的单独单个任务就可以定义标签在执行的时候就可以执行单个roles下的任务
[ roles-demo]# vim site.yaml --- - hosts: webservers gather_facts: no remote_user: root roles: - role: common - role: nginx vars: dir: /opt/a app_port: 80 tags: nginx - role: php vars: dir: /opt/b app_port: 81 tags: php [ roles-demo]# ansible-playbook site.yaml -i hosts --tags nginx PLAY [webservers] ******************************************************************************************************************* TASK [nginx : nginx task test] ****************************************************************************************************** ok: [10.4.7.21] => { "msg": "nginx task test > /opt/a 80 1.15 5.6" } ok: [10.4.7.22] => { "msg": "nginx task test > /opt/a 80 1.15 5.6" } PLAY RECAP ************************************************************************************************************************** 10.4.7.21 : ok=1 changed=0 unreachable=0 failed=0 10.4.7.22 : ok=1 changed=0 unreachable=0 failed=0