Ansible基础 - 08Roles
Ansible基础 - 08Roles
一、概述
对于以上所有的方式有个弊端就是无法实现复用。假设在同时部署Web、db、ha 时或不同服务器组合不同的应用就需要写多个yml文件。很难实现灵活的调用。
roles 用于层次性、结构化地组织playbook。
roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。
简单来讲,roles就是通过分别将变量(vars)、文件(file)、任务(tasks)、模块(modules)及处理器(handlers)放置于单独的目录中,并可以便捷地include它们的一种机制。
角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。
二、Roles目录
Roles规定了严格的目录格式,必须按照目录结构和文件名进行创建,否则加载不到。
- files/: 此目录存储由copy或script等模块调用的文件;
- tasks/: 此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行"包含"调用;
- handlers/: 此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行"包含"调用;
- vars/: 此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行"包含"调用;
- templates/:此目录存储由template模块调用的模板文本;
- meta/: 此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行"包含"调用;
- default/: 此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;
三、创建Roles
3.1 目录结构
[root@cl-server ~]# cd /etc/ansible/roles
[root@cl-server roles]# mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}
[root@cl-server roles]# tree nginx
nginx
├── default
├── files
│ ├── nginx-1.20.1-2.el7.x86_64.rpm
│ ├── nginx-1.21.0-1.el7.ngx.x86_64.rpm
│ └── nginx-1.21.3-1.el7.ngx.x86_64.rpm
├── handlers
│ └── main.yml
├── meta
├── tasks
│ └── main.yml
├── templates
│ └── nginx.conf.j2
└── vars
└── main.yml
7 directories, 7 files
3.2 tasks 目录
### 定义主任务
[root@cl-server roles]# cat nginx/tasks/main.yml
- name: update_yum
command: "{{ item }}"
with_items:
- yum clean all
- yum repolist
- name: copy_package
copy: src=nginx-{{ install_rpm }}.rpm dest=/tmp/nginx-{{ install_rpm }}.rpm
- name: install
yum: name=/tmp/nginx-{{ install_rpm }}.rpm state=latest
- name: conf
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
tags: nginxconf
when: nginx_conf_replace
notify: new conf to reload
- name: start service
service: name=nginx state=started enabled=true
when: start_service
nginx/tasks/main.yml ### main.yml的另一种编写方式
- include_tasks: install.yml
- include_tasks: configure.yml
- include_tasks: start_service.yml
3.3 vars目录
### 定义变量
[root@cl-server roles]# cat nginx/vars/main.yml
nginxport: 9999
3.4 handlers目录
[root@cl-server roles]# cat nginx/handlers/main.yml
- name: new conf to reload
service: name=nginx state=restarted
3.5 templates目录
[root@cl-server roles]# cat nginx/templates/nginx.conf.j2
user nginx;
worker_processes {{ ansible_processor_vcpus }};
// 省略其他配置
http {
// 省略其他配置
server {
listen {{ nginxport }};
listen [::]:{{ nginxport }};
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
}
}
3.6 roles执行文件
[root@cl-server ansible]# cat roles-v1.1.yml - hosts: cl-node03 remote_user: root vars: - install_rpm: 1.21.3-1.el7.ngx.x86_64 - nginx_conf_replace: False - start_service: False roles: - nginx
3.7 执行roles
四、基于roles执行多角色任务
[root@cl-server ~]# cat /etc/ansible/roles-v1.2.yml
- hosts: cl-node03
remote_user: root
vars:
- install_rpm: 1.21.0-1.el7.ngx.x86_64
- nginx_conf_replace: True
- start_service: True
roles:
- nginx
---
- hosts: cl-node01
remote_user: root
roles:
- httpd
[root@cl-server ansible]# ansible-playbook roles-v1.2.yml
PLAY [cl-node03] ****************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************
ok: [cl-node03]
TASK [nginx : update_yum] *******************************************************************************************
changed: [cl-node03] => (item=yum clean all)
changed: [cl-node03] => (item=yum repolist)
[WARNING]: Consider using the yum module rather than running 'yum'. If you need to use command because yum is
insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get
rid of this message.
TASK [nginx : copy_package] *****************************************************************************************
ok: [cl-node03]
TASK [nginx : install] **********************************************************************************************
changed: [cl-node03]
TASK [nginx : conf] *************************************************************************************************
changed: [cl-node03]
TASK [nginx : start service] ****************************************************************************************
changed: [cl-node03]
RUNNING HANDLER [nginx : new conf to reload] ************************************************************************
changed: [cl-node03]
PLAY [cl-node01] ****************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************
ok: [cl-node01]
TASK [httpd : copy_file] ********************************************************************************************
changed: [cl-node01]
TASK [httpd : install_telnet] ***************************************************************************************
ok: [cl-node01]
PLAY RECAP **********************************************************************************************************
cl-node01 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
cl-node03 : ok=7 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0