一、roles简介

  ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需在playbook中使用include指定即可。简单来讲,roles就是通过分别将变量、文件、任务、模板以及处理器放置于单独目录中,并可以便捷的使用include指令将他们组织在一块的一种机制。角色一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。复杂场景建议使用角色,代码复用度高。

  二、roles目录结构

  roles目录结构如上所示,每个角色以特定的层次目录结构进行组织。其中roles/目录下是每个角色的目录,比如上图有git和user两个角色,每个角色下分别有tasks、files、vars等等目录,files/目录主要存放copy或scripts模块等调用的文件;templates/目录主要存放template模块查找所需要的模板文件;tasks/定义task,role的基本元素,至少应该包含一个名为main.yml的文件(这个文件就是tasks目录的入口文件),其他的文件需要在此文件中通过include进行包含;handlers/目录主要存放触发器任务的yml文件,同样它里面至少需要有一个main.yml的入口文件,其文件内容通过include指令引用其下文件;vars/目录主要存放定义的变量文件,同样也需要有main.yml文件;meta/目录定义当前角色的特殊设定以及依赖关系,同样这个目录也需要有一个main.yml的入口文件;default/设定默认变量时使用此目录中的main.yml文件;

  通过上面的介绍,不难发现roles是依赖目录的命名和摆放,默认tasks/main.yml是所有任务的入口,所以使用roles的过程可以理解为目录规范化命名的过程。每个目录下均由main.yml定义该功能的任务集,tasks/main.yml默认执行所有指定的任务。roles的调用文件playbook_roles.yml的内容如下

---
- hosts: websers
remote_user: root roles:
- roles_name

  说明:定义好角色我们还需要写一个调用角色的playbook.yml 用于调用角色,其中我们要写明这个角色用于那些主机(在那些主机上执行),在远程主机上以那个用户来执行角色以及执行那些角色。

  角色的执行方法同执行playbook一样,我们只需要执行定义调用角色的playbook即可;roles目录可以摆放在/etc/ansible/ansible.cfg中"roles_path"定义路径,也可以和入口playbook文件存放在同级目录,ansible没有强制的要求,但还是建议将代码存放在代码集预先规划的目录,以便管理。

  三、创建角色

  通常创建role的步骤有如下4步

  1)创建以roles命名的目录

  2)在roles目录中分别创建以各自角色名称命名的目录,如nginx等

  3)在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates、和vars目录;若角色用不到的目录可以是空目录,也可以不创建

  4)在playbook文件中,调用各角色

示例:将我们之前写的playbook修改成角色

playbook代码以及目录结构如下:

[root@test ~]#tree
.
├── install_nginx.yml
└── templates
├── centos6_nginx.conf.j2
└── centos7_nginx.conf.j2 1 directory, 3 files
[root@test ~]#cat install_nginx.yml
---
- hosts: websers
remote_user: root tasks:
- name: install nginx
yum: name=nginx
- name: templates config file centos6
template: src=centos6_nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
when: ansible_distribution_major_version == "6"
- name: templates config file centos 7
template: src=centos7_nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
when: ansible_distribution_major_version == "7"
- name: start service
service: name=nginx state=started
handlers:
- name: restart nginx
service: name=nginx state=restarted [root@test ~]#

改编成角色目录结构以及各目录文件内容如下

[root@test ~]#tree
.
├── install_nginx.yml
├── nginx_role.yml
├── roles
│   └── nginx
│   ├── handlers
│   │   ├── main.yml
│   │   └── restart_nginx.yml
│   ├── tasks
│   │   ├── install_nginx.yml
│   │   ├── main.yml
│   │   ├── nginx_service.yml
│   │   └── template_config_file.yml
│   └── templates
│   ├── centos6_nginx.conf.j2
│   └── centos7_nginx.conf.j2
└── templates
├── centos6_nginx.conf.j2
└── centos7_nginx.conf.j2 6 directories, 12 files
[root@test ~]#cat roles/nginx/tasks/install_nginx.yml
- name: install nginx
yum: name=nginx
[root@test ~]#cat roles/nginx/tasks/template_config_file.yml
- name: templates config file centos6
template: src=centos6_nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
when: ansible_distribution_major_version == "6"
- name: tmeplates config file centos7
template: src=centos7_nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
when: ansible_distribution_major_version == "7" [root@test ~]#cat roles/nginx/tasks/nginx_service.yml
- name: start service
service: name=nginx state=started
[root@test ~]#cat roles/nginx/tasks/main.yml
- include: install_nginx.yml
- include: template_config_file.yml
- include: nginx_service.yml
[root@test ~]#cat roles/nginx/handlers/restart_nginx.yml
- name: restart nginx
service: name=nginx state=restarted
[root@test ~]#cat roles/nginx/handlers/main.yml
- include: restart_nginx.yml
[root@test ~]#

  说明:以上目录编排就实现了一个简单角色,我们把playbook内容分别用一个文件存放,然后按照每个目录的main.yml文件定义的顺序依次执行,这里只是定义好了一个角色,我们还需要写一个playbook来调用该角色即可。

[root@test ~]#cat nginx_role.yml
---
- hosts: websers
remote_user: root roles:
- nginx
[root@test ~]#

  说明:以上就是一个调用我们刚才编排好的nginx角色的playbook。用ansilble-playbook 命令去执行以上调用角色的playbook,就相当于我们之前写的playbook功能完全一样。

[root@test ~]#ansible-playbook nginx_role.yml 

PLAY [websers] ******************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************
ok: [192.168.0.128]
ok: [192.168.0.218] TASK [nginx : install nginx] ****************************************************************************************
changed: [192.168.0.128]
changed: [192.168.0.218] TASK [nginx : templates config file centos6] ************************************************************************
changed: [192.168.0.128]
changed: [192.168.0.218] TASK [nginx : tmeplates config file centos7] ************************************************************************
skipping: [192.168.0.128]
skipping: [192.168.0.218] TASK [nginx : start service] ****************************************************************************************
changed: [192.168.0.128]
changed: [192.168.0.218] RUNNING HANDLER [nginx : restart nginx] *****************************************************************************
changed: [192.168.0.128]
changed: [192.168.0.218] PLAY RECAP **********************************************************************************************************
192.168.0.128 : ok=5 changed=4 unreachable=0 failed=0
192.168.0.218 : ok=5 changed=4 unreachable=0 failed=0 [root@test ~]#ansible websers -m shell -a 'ss -ntl'
192.168.0.128 | SUCCESS | rc=0 >>
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 :::80 :::*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 *:22 *:* 192.168.0.218 | SUCCESS | rc=0 >>
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:35725 *:*
LISTEN 0 128 :::111 :::*
LISTEN 0 128 *:111 *:*
LISTEN 0 128 :::80 :::*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:631 *:*
LISTEN 0 128 ::1:631 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::47546 :::* [root@test ~]#

  说明:可看到我们把playbook改编成角色同我们写的playbook执行后的结果是一样的,都实现了同样的功能。

  四、角色调用

  方法一:写好要调用的角色列表

---
- hosts: websers
remote_user: root roles:
- mysql
- nginx
- memcached

  说明:此方法同上面示例一样,我们需要调用那些角色,只需要把角色名写在角色列表里即可

  方法二:调用角色的同时给角色传递变量

---
- hosts: websers
remote_user: root roles:
- mysql
- {role: nginx,username: nginx}
- memcached

  说明:此方法在调用nginx角色的同时,还给nginx角色传递了一个变量和值,role键用于指定角色名,后续可以多个k/v,用于给角色传递变量。

  方法三:基于条件测试实现角色调用

---
- hosts: websers
remote_user: root roles:
- mysql
- {role: nginx,username: nginx}
- {role: memcached,when: ansible_distribution_major_version == "7",username: memcached}

  说明:此方法实现了当系统版本为7 的时候才调用memcached角色,换句话说只有在目标系统版本为7 的系统才能调用memchched角色,同时它也可以向脚本传递变量。

  五、roles playbook tags 的使用

上面角色调用的时候我们介绍了三种方式,事实上我们不仅能给角色传递变量,我们还可以给角色打标签,通过执行playbook 指定标签 就可以实现只执行具有指定标签的角色,如下所示

---
- hosts: websers
remote_user: root roles:
- {role: mysql,tags: ["mysql","db"]}
- {role: marridb,tags: ["mysql","db"]}
- {role: nginx,tags: ["nginx","web"],username: nginx}
- {role: memcached,when: ansible_distribution_major_version == "7",username: memcached}
- {role: httpd,tags: ["httpd","web"]}
- {role: php,tags: php}

  说明:我们在调用角色的时候,我们可以给角色打上多个标签,其作用在于,这样把同类角色打上相同的标签,我们在执行其playbook的时候就可以选择性的执行某些指定标签的角色,比如以上我们执行标签为“web”的角色,我们可以在执行playbook的时候用-t选项指定“web”,这样我们就可以实现只在目标主机上执行httpd和nginx这两个角色的目的。如果我们给一个角色打上多个标签需要写成列表的形式,用中括号把多个标签名给括起来,每个标签之间用逗号隔开,同时需要注意的是,标签上一个字符串,需要用引号将其引起来。

Ansible之roles角色的更多相关文章

  1. Ansible:roles初始化系统

    简介 本文介绍ansible的roles,通过roles来实现系统的初始化,其相当于将ansible的playbook拆分.本文通过Jenkins,传参,调用playbook来初始化系统. Githu ...

  2. Ansible_使用Ansible galaxy部署角色

    一.介绍Anisble galaxy 1.介绍Ansibleu galaxy 1️⃣:Ansible Galaxy (官网:https://galaxy.ansible.com)是一个Ansible内 ...

  3. Ansible之roles模块--lnmp分布式部署

    Ansible之roles模块--lnmp分布式部署 目录 Ansible之roles模块--lnmp分布式部署 1. role模块的作用 2. roles的目录结构 3. roles内个目录含义解释 ...

  4. Ansible的roles标准化与Jenkins持续集成(三)

    Ansible的roles标准化与Jenkins持续集成(三) 链接:https://pan.baidu.com/s/1A3Iq3gGkGS27L_Gt37_I0g 提取码:ncy2 复制这段内容后打 ...

  5. Ansible Roles角色

    Roles小技巧: 1.创建roles目录结构,手动或使用ansible-galaxy init test roles 2.编写roles的功能,也就是tasks. nginx rsyncd memc ...

  6. 6.Ansible Roles角色实战

    ==Roles小技巧:== 1.创建roles目录结构,手动或使用ansible-galaxy init test roles 2.编写roles的功能,也就是tasks. nginx rsyncd ...

  7. Git+Gitlab+Ansible的roles实现一键部署Nginx静态网站(一)--技术流ken

    前言 截止目前已经写了<Ansible基础认识及安装使用详解(一)--技术流ken>,<Ansible常用模块介绍及使用(二)--技术流ken><Ansible剧本介绍及 ...

  8. Ansible playbook roles

    1  概述 角色(roles):如果我们使用playbook写成一个文件,这个文件会很大,但是不方便组织,我们可以分组,把playbook根据功能,如handler,tasks等分门别类的放在在各自的 ...

  9. Ansible Playbook Roles and Include Statements

    介绍 虽然可以在一个非常大的文件中编写一个playbook(您可能会以这种方式开始学习playbook),但最终您将需要重新使用文件并开始组织事情. 在基本级别,饱含任务的文件允许您将配置策略分解成较 ...

随机推荐

  1. nlp英文的数据清洗代码

    1.常用的清洗方式 #coding=utf-8 import jieba import unicodedata import sys,re,collections,nltk from nltk.ste ...

  2. JavaScript 引擎 V8 执行流程概述

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/t__Jqzg1rbTlsCHXKMwh6A作者:赖勇高 本文主要讲解的是V8的技术,是V8的入 ...

  3. BOM介绍以及方法

    BOM介绍和window对象的方法 一.BOM对象 (浏览器对象模型 BOM) 1.window alert() confirm() prompt() setInterval() ​ setTimeo ...

  4. 【问题记录】 Linux分区磁盘占满,导致ssh登陆闪退

    问题描述 今天要去后台看日志查个问题,通过ssh登陆到服务器后准备用平时非常熟悉的less命令打开日志查看,突然xshell客户端就闪退了.一时感觉很蒙,怎么回事??由于之前有同事遇到类似的问题,提醒 ...

  5. 一分钟了解Docker

    一.Docker概述 Docker和虚拟机一样,都拥有环境隔离的能力,但它比虚拟机更加轻量级,可以使资源更大化地得到应用. Docker用途:简单配置.代码流水线管理.开发效率.应用隔离.服务器整合. ...

  6. C/C++ 中 `printf` 格式化

    作为强类型静态语言,类型不仅规定了可以对数据进行的操作,还决定了应该怎样在 printf 中输出. printf 的签名是: int printf ( const char * format, ... ...

  7. ASP.NET MVC5基础 – MVC文件架构

    创建MVC项目 首先,我们使用Visual Studio2019创建一个MVC架构的应用程序.步骤如下:首先打开VS2019,在启动页选择[创建新项目].然后选择创建 ASP.NET Web 应用程序 ...

  8. 使用策略模式重构switch case 代码

    目录 1.背景 2.案例 3.switch…case…方式实现 4.switch…case…带来的问题 5.使用策略模式重构switch…case…代码 6.总结 1.背景 之前在看<重构    ...

  9. MySql Navicat可视化工具

    下载链接 链接:https://pan.baidu.com/s/1ca5KbpCFc4UbcYkXZDu6aA 提取码:8nku 安装比较简单,选完安装路径,下一步即可 Navicat for MyS ...

  10. 未能找到元数据文件**.dll解决办法

    解决方案里有很多项目.生成时提示100多个错误,都是未能找到元数据文件**.dll. 那就清理一下解决方案,一个一个来吧. 生成GateWay.Utilities项目时,虽然提示成功了,却发现bin/ ...