Ansible Roles

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

 

posted @ 2023-05-14 15:18  小粉优化大师  阅读(29)  评论(0编辑  收藏  举报