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