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