roles 简介
一个项目从开始到结束,不是简单几十个 playbook 就可以完事了,当文件数很多,有上百个的话,仅通过简单的 includes 不停的引用,那最终的结果错综复杂。这个时候 ansible roles 就可以很好的发挥它的作用了。
roles,字面意思是角色的含义,可以理解为有相互关联功能的集合。我们把安装 ntp、mem、nginx、db 等等的功能角色放在一个大仓库里,然后用到哪个,从那里面去拿,拿一个,拿两个都可以。
roles 是个目录,角色集合
roles 功能可以用来规范 playbook 的编写
roles 使用
创建所需要的 roles 原型目录结构
tree rolesbzh/ 标准化目录 rolesbzh/ ├── nginx.retry #文件:/etc//ansible/hosts 里的主机名 ├── nginx.yaml #文件: 触发器, 用来触发 roles 内的不同剧本 └── roles #目录: 里面存放不同的剧本目录 └── nginx #目录: 存放 nginx 剧本相关模块 ├── files #目录:files 存放 copy 模块和 script 模块的参数 src 默认会从这个文件夹查找 │ ├── test #要上传的文件 │ └── test.sh #需要在目标主机执行的脚本 ├── handlers #用来存放 notify 的,自定义动作 │ └── main.yaml ├── tasks #用来存放 ansible 任务的模块,ansible 会根据里面写的执行过程进行剧本的执行 │ └── main.yaml ├── templates #template 模块的使用, 用来存放可变配置文件 j2 的 │ └── test.j2 └── vars #用来存放变量的 └── main.yaml
入口触发配置文件
ansible-playbook 执行入口配置文件 nginx.yaml 后,它会自动在 roles 目录下查找 nginx 目录并进入后查找 tasks 任务目录并执行 main.yaml 的任务配置文件。
cat /root/rolesbzh/nginx.yaml --- - hosts: all #执行的主机范围 gather_facts: True #开启系统内置变量 roles: #启用 roles 原型配置 - nginx #执行 nginx 原型模组, 即 roles 里的 nginx 剧本
roles 中 tasks 任务编排模组的使用
#在 nginx 模组添加 tasks 任务配置文件 vim /root/rolesbzh/roles/nginx/tasks/main.yaml --- - name: ping #任务 1 的名字 ping (名字可有可无可随意) ping: #执行 ping - name: 执行 shell #任务 2 的名字 执行 shell shell: ls / #执行 ls 查看跟目录 register: i #将执行的结果带入一个变量 i 内 - debug: var=i #将变量 i 输出出来 - name: 变量 #任务 3 的名字 变量 shell: echo my name is {{ my_name }},{{ qq }} #执行命令可调用 vars 变量 register: I #将执行的结果带入一个变量 I 内 - debug: var=I #将变量 I 输出出来 - name: copy #任务 4 的名字 copy copy: src=test dest=/root/ #将 files 目录下的 test 移动到目标主机的 root 下 - name: script #任务 5 的名字 script script: test.sh #在目标主机执行 files 目录下的 test.sh 脚本 - name: 可变配置文件 #任务 6 的名字 可变配置文件 template: src=test.j2 dest=/root/text1 #将 templates 目录下的 test.j2 文件移动到目标主机 root 目录下改名为 text1 并将变量变为值 notify: reload #如果 template 发生变化则执行 handles 里的动作, 如果 template 没有发生变化则不执行 handles 里的动作
roles 中 vars 自定义变量模组的使用
#创建自定义变量 vars 模组的配置文件 vim /root/rolesbzh/roles/nginx/vars/main.yaml --- my_name: wk #变量 my_name 值 wk qq: 224901 #变量 qq 值 224901
使用 copy,script 模块的标准化
roles 模型里使用 copy,script 模块,默认从 roles/nginx/files 这里面找
vim //root/rolesbzh/roles/nginx/files/test #files 存放的文件 生死阔契 vim /root/rolesbzh/roles/nginx/files/test.sh #files 存放的脚本 files 里的脚本在客户机执行完后会自行删除, 等于无痕执行了一次脚本 echo "与子成说" > /tmp/test chmod +x roles/nginx/files/test.sh
roles 中 template 模块的使用
roles 模型里使用 template 模块,默认从 roles/nginx/template 里面找
vim /root/rolesbzh/roles/nginx/templates/test.j2 my name is {{ my_name }},my qq {{ qq }},my ip {{ansible_all_ipv4_addresses[0]}} #引用自定义变量和内置变量
roles 中 notify 模块的使用
roles 使用 notify 模块,默认从 roles/nginx/handles 里面找
vim /root/rolesbzh/roles/nginx/handlers/main.yaml --- - name: start #定义 handlers 的动作类型 shell /usr/local/nginx/sbin/nginx - name; stop #定义 handlers 的动作类型 shell /usr/local/nginx/sbin/nginx -s stop - name; reload #定义 handlers 的动作类型 shell /usr/local/nginx/sbin/nginx -s reload
notify 下发通知只有当之前的任务造成了变化那么才会被执行,如果没有发生任何改变,则 notify 不会被执行。
最后,运行
在 rolesbzh 目录下运行
ansible-playbook nginx.yaml
本文作者为 olei,转载请注明。