Roles 介绍
roles 能够根据层次型结构自动装载变量文件, task 以及 handlers 等. 简单来讲, roles 就是通过分别将变量, 文件, 任务, 模块及处理器放置于单独的目录中, 并可以便捷地 include 它们, roles 一般用于基于主机构建服务的场景中, 但也可以用于构建守护进程等场景中.
针对 roles 中各个不同执行操作需要建立单独目录.
例如:
- roles/
- httpd/
- files/
- templates/
- tasks/
- handlers/
- vars/
- defaults/
- meta/
roles 内各目录含义解释
files: 用来存放由 copy 模块或 script 模块调用的文件.
templates: 用来存放 jinjia2 模板, template 模块会自动在此目录中寻找 jinjia2 模板文件.
tasks: 此目录应当包含一个 main.yml 文件, 用于定义此角色的任务列表, 此文件可以使用 include 包含其它的位于此目录的 task 文件.
handlers: 此目录应当包含一个 main.yml 文件, 用于定义此角色中触发条件时执行的动作.
vars: 此目录应当包含一个 main.yml 文件, 用于定义此角色用到的变量.
defaults: 此目录应当包含一个 main.yml 文件, 用于为当前角色设定默认变量.
meta: 此目录应当包含一个 main.yml 文件, 用于定义此角色的特殊设定及其依赖关系.
在一个 playbook 中使用 roles 的步骤:
1) 创建以 roles 命令的目录.
mkdir /etc/ansible/roles/ -p #yum 装完默认就有
2) 创建全局变量目录.
- mkdir /etc/ansible/group_vars/ -p
- touch /etc/ansible/group_vars/all #文件名自己定义, 引用的时候注意
3) 在 roles 目录中分别创建以各角色名称命令的目录, 如 httpd.
mkdir /etc/ansible/roles/common -p
4) 在每个角色命令的目录中分别创建 files,handlers,tasks,templates,meta,defaults 和 vars 目录, 用不到的目录可以创建为空目录, 但不可以不创建.
- mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
- mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
5) 在每个角色的 handlers,tasks,meta,defaults,vars 目录下创建 main.yml 文件, 千万不能自定义.
- touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yaml
- touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yaml
6) 在 playbook 文件中, 调用各角色.
- vim /etc/ansible/lamp.yaml
- ---
- - hosts: webserver
- remote_user: root
- roles:
- - httpd
- - mysql
- ansible-playbook lamp.yaml
利用 Roles 简单安装 LAMP 架构
1, 创建工作目录及对应 yaml 文件
创建 roles 执行目录
- mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
- mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
- mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p
创建执行目录下 yaml 文件, 注意每个目录下文件名称必须是 main.yaml 格式, 否则无法识别.
- touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yaml
- touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yaml
- touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yaml
2,httpd 模块
- vim /etc/ansible/roles/httpd/tasks/main.yaml
- - name: ensure apache is at the latest version
- yum: pkg={{ pkg }} state=latest
定义变量: 可以定义在全局变量中, 也可以定义在 roles 角色变量中, 一般定义在角色变量中
- vim/etc/ansible/roles/httpd/vars/main.yaml
- pkg: httpd
3,mysql 模块
- vim /etc/ansible/roles/mysql/tasks/main.yaml
- - name: ensure mysql is at the latest version
- yum: pkg={{ pkg }} state=latest
- vim /etc/ansible/roles/mysql/vars/main.yaml
- pkg: mariadb*
4,php 模块
- vim /etc/ansible/roles/php/tasks/main.yaml
- - name: ensure php is at the latest version
- yum: pkg={{ pkg }} state=latest
- vim /etc/ansible/roles/php/vars/main.yml
- pkg: php
5, 编写 role 执行实例
- vim /etc/ansible/lamp.yaml
- ---
- - hosts: webserver // 对主机组执行 role
- remote_user: root
- roles: // 依次需要执行的 role
- - httpd
- - mysql
- - php
按照 playbook 方式执行 role
ansible-playbook lamp.yaml
来源: http://www.bubuko.com/infodetail-2716304.html