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  

  

相关