1、Roles基本概述
已经学过 tasks 和 handlers ,那怎样组织 playbook 才是最好的方式呢?
简单的回答就是:使用 RolesRoles 基于一个已知的文件结构,去自动的加载 vars,tasks 以及 handlers 以便playbook 更好的调用。
roles 相比 playbook 的结构更加的清晰有层次,但 roles 显然要比 playbook更加复杂难理解!
比如:我们无论安装什么软件都会安装时间同步服务,那么每个 playbook 都要编写时间同步服务的 task 。此时我们可以将时间同步服务 task 任务编写好,等到需要使用的时候进行调用就行了。
2、Roles目录结构
2.1、说明
roles 官方目录结构,必须按如下方式定义。在每个目录中必须有 main.yml 文件,这些属于强制要求
2.2、目录解析
mkdir {nginx,keepalived}/{vars,tasks,templates,handlers,files,meta} -p
]# tree nginx/
nginx/ # 角色目录
├── files # 存放文件
├── handlers # 触发任务
├── meta # 依赖关系
├── tasks # 具体任务
├── templates # 模板文件
└── vars # 定义变量
3、Roles依赖关系
3.1、说明
roles 允许在使用时自动引入其他 role , role 依赖关系存储在meta/main.yml 文件中。
3.2、依赖关系【 安装 wordpress 】示例
3.2.1、流程
1、需要先确保 nginx 与 php-fpm 的 role 都能正常运行
2、然后在 wordpress 的 role 中定义,依赖关系
3、依赖的 role 有 nginx 以及 php-fpm
3.2.2、meta/main.yml定义
]# cat /root/roles/wordpress/meta/main.yml
---
dependencies:
- { role: nginx }
- { role: php-fpm }
3.2.3、执行流程
wordpress 的 role 会先执行 nginx、php-fpm 的 role ,最后在执行 wordpress本身
4、Roles流程
1、创建 roles 目录结构,手动创建或使用 ansible-galaxy init test_roles
2、编写 roles 的功能,也就是 tasks
3、最后 playbook 引用 roles 编写好的 tasks
5、示例1-Roles部署NFS
5.1、准备目录
mkdir -p {nfs,group_vars}/{templates,handlers,tasks,file,vars}
]# tree .
|-- group_vars
└── nfs
├── file
├── handlers
├── tasks
├── templates
└── vars
5.2、定义 roles 主机清单
cat << 'CAT_END' > hosts
[nfs]
192.168.10.16
CAT_END
5.3、定义 nfs 角色的 tasks 任务
cat << 'CAT_END' > nfs/tasks/main.yaml
- name: install nfs server
yum: name=nfs-utils state=present
- name: configure nfs server
template:
src: exports.j2
dest: /etc/exports
notify: restart nfs server
- name: create group www
group:
name: www
- name: create user www
user:
name: www
group: www
create_home: no
shell: /sbin/nologin
- name: create directory data
file: path={{share_dir}} state=directory owner=www group=www mode=0755
- name: start nfs server
systemd: name=nfs state=started enabled=yes
CAT_END
5.4、定义 nfs 角色的 handlers
cat << 'CAT_END' > nfs/handlers/main.yaml
- name: restart nfs server
systemd: name=nfs state=restarted
CAT_END
5.5、定义 nfs 角色的 templates 目录
cat << 'CAT_END' > nfs/templates/exports.j2
{{ share_dir }} {{ share_ip }}(rw,sync,all_squash,anonuid=666,anongid=666)
CAT_END
5.6、定义 nfs 角色变量
cat << 'CAT_END' > group_vars/all
share_dir: /data
share_ip: 192.168.10.0/24
CAT_END
5.7、定义 nfs role 入口
cat << 'CAT_END' > role_main.yaml
- hosts: nfs
remote_user: root
roles:
- nfs
CAT_END
5.8、定义完成的目录结构
]# tree .
.
├── group_vars
│ └── all
├── hosts
├── nfs
│ ├── file
│ ├── handlers
│ │ └── main.yaml
│ ├── tasks
│ │ └── main.yaml
│ ├── templates
│ │ └── exports.j2
│ └── vars
└── role_main.yaml
5.9、执行playbook
]# ansible-playbook -i hosts role_main.yaml
PLAY [nfs] ***************************************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.10.16]
TASK [install nfs server] ************************************************************************************************************************************
ok: [192.168.10.16]
TASK [configure nfs server] **********************************************************************************************************************************
ok: [192.168.10.16]
TASK [nfs : create group www] ********************************************************************************************************************************
changed: [192.168.10.16]
TASK [nfs : create user www] *********************************************************************************************************************************
changed: [192.168.10.16]
TASK [nfs : create directory data] ***************************************************************************************************************************
changed: [192.168.10.16]
TASK [start nfs server] **************************************************************************************************************************************
changed: [192.168.10.16]
PLAY RECAP ***************************************************************************************************************************************************
192.168.10.16 : ok=7 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
6、多Role实践【伪代码】
6.1、定义基础包【主要用于环境的初始化】
6.1.1、目录结构
]# tree base_module
base_module
├── files
├── handlers
├── tasks
│ └── main.yml
└── templates
6.1.2、tasks任务
]# cat base_module/tasks/main.yml
- name: Configure BASE Repos
yum_repository:
name: base
description: BASE YUM repo
baseurl: http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck: yes
gpgkey: http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
- name: Configure EPEL Repos
yum_repository:
name: epel
description: EPEL YUM repo
baseurl: http://mirrors.aliyun.com/epel/7/$basearch
- name: Configure Nginx Repos
yum_repository:
name: nginx
description: Nginx YUM Repo
baseurl: http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck: yes
gpgkey: https://nginx.org/keys/nginx_signing.key
when: ( ansible_hostname is match ("web*")) or (ansible_hostname is match ("proxy*"))
- name: Installed Base SoftWare
yum:
name: "{{ item }}"
state: present
loop:
- wget
- httpd-tools
- lrzsz
- nfs-utils
- bind-utils
- net-tools
- unzip
- vim
- gcc
- mariadb
- MySQL-python
- git
- name: Add Process Group
group:
name: www
gid: 666
- name: Add Process User
user:
name: www
uid: 666
create_home: no
shell: /sbin/nologin
- name: Disable Selinux
selinux:
state: disabled
- name: Disable Firewalld
systemd:
name: firewalld
state: stopped
enabled: no
6.2、role_main 入口的定义
]# cat site.yml
- hosts: all
roles:
- base_module
- hosts: dbservers
roles:
- redis
- mysql