ansible playbook之roles
playbook之roles
https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html
https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_includes.html
https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse.html#playbooks-reuse
ansible-galaxy
Role是一个完整的任务体系,拥有Role之后就可以去使用它,或者也可以分发给别人使用。
roles仓库:https://galaxy.ansible.com/
就像github和dockerhub一样的仓库
在一些逻辑上,可以参考别人的思路
#搜索
[root@ansible ~]# ansible-galaxy search 'nginx'
#info查看信息
[root@ansible ~]# ansible-galaxy info aacnp.nginx
#下载到指定目录
[root@ansible ~]# ansible-galaxy install aacnp.nginx -p /tmp
#列出roles
[root@ansible ~]# ansible-galaxy list -p ~/ansible/roles/
import和include
https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse.html#re-using-files-and-roles
根据官方文档的说法,一个是动态加载,一个是静态加载
import_task(静态加载):当playbook开始执行时就预先加载好变量
include_task(动态加载):当playbook运行时遇到变量在加载
一些区别比较:Imports: static re-use
roles
oles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles 。
role的默认路径在配置文件ansible.cfg中修改
#roles_path = /etc/ansible/roles
roles目录结构
roles是管理ansible文件的一种规范(目录结构)
roles会按照标准的规范,自动到特定的目录和文件中读取数据
目录结构,所以roles目录中的各个文件之间的调用,不需要写路径
defualts/main.yml:定义变量的缺省值,优先级较低
files目录:存储静态文件的目录
handlers/main.yml:定义handlers
meta/main.yml:写作者、版本等描述信息
README.md:整个角色(role)的描述信息
tasks/main.yml:定义任务的地方
templates目录:存放动态数据文件的地方(模板文件)
vars/main.yml:定义变量,优先级高
创建Role
语法:见官方文档
使用ansible-galaxy来创建roles
[root@ansible ~]# mkdir -p ~/ansible/roles
[root@ansible ~]# ansible-galaxy init ~/ansible/roles/first_role
- Role /root/ansible/roles/first_role was created successfully
[root@ansible ~]#
[root@ansible ~]# tree ~/ansible/roles/first_role/
/root/ansible/roles/first_role/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 8 files
定义role变量
在之前的目录结构中,有两个地方可以定义变量
- defatlts/main.yml:定义变量的缺省值,优先级较低
- vars/main.yml:定义变量,优先级高
这两个文件之间的区别在于,defaults/main.yml中定义的变量优先级低于vars/main.yml中定义的变量。
defaults/main.yml中的变量优先级是最低的,其他地方的变量优先级仍比它高
示例:
PORT: 80
USERNAME: apache
定义role的tasks
Role的任务定义在roles/xxx/tasks/main.yml文件中,main.yml是该Role任务的入口,在执行Role的时候会自动执行main.yml中的任务。
一是直接定义在tasks/main.yml中(流程多的时候不建议使用)
二是定义在tasks目录下的其他文件中,然后include_tasks或import_tasks引入它
示例:
#task目录下创建install.yml
[root@ansible tasks]# cat install.yml
---
- name: install http
yum: name=httpd state=installed
#main文件中引用
[root@ansible tasks]# cat main.yml
---
- import_tasks: install.yml
role的入口文件
role下面的各种目录定义好之后,还需要在role目录相同目录层次的地方提供一个被playbook执行的入口文件。在这个入口文件中引入一个或多个roles目录下的Role。
这个文件名字叫什么都行,例如site.yml、main.yml、enter.yml等,但一定要和role目录在同一目录层次
所以role有点像saltstack中top.sls的味道
例子:
#first_role是role目录
roles/
├── enter.yml
└── first_role
#或者放入上一层
├── enter.yml
└── roles
└── first_role
[root@ansible ansible]# cat enter.yml
---
- name: test
hosts: apache
gather_facts: false
roles:
- first_role
#运行
[root@ansible ansible]# ansible-playbook enter.yml
PLAY [test] ********************************************************************************************************************************************************
TASK [first_role : install http] ***********************************************************************************************************************************
changed: [apache]
PLAY RECAP *********************************************************************************************************************************************************
apache : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
定义role的handler
handler和task类似,它定义在roles/.../handlers/main.yml中,当Role的task触发了对应的handler,会自动来此文件中寻找。
仍然要说的是,可以将handler定义在其它文件中,然后在roles/.../handlers/main.yml使用include_tasks或import_tasks指令来引入.