一、roles介绍

什么情况下用到roles?

假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成php服务器,第三个要配置成MySQL服务器。我们如何来定义playbook?

第一个play用到第一个主机上,用来构建httpd,第二个play用到第二个主机上,用来构建php,第三个play用到第三个主机上,用来构建MySQL。这些个play定义在playbook中比较麻烦,将来也不利于模块化调用,不利于多次调。比如说后来又加进来一个主机,这个第4个主机既是httpd服务器,又是php服务器,我们只能写第4个play,上面写上安装httpd和php。这样playbook中的代码就重复了。

也就是说playbooks的所有的方式有个弊端---无法实现重复使用且代码重复;假设在同时部署httpd,php,mayql时或不同服务器组合不同的应用就需要写多个yaml文件。很难实现灵活的调用。

roles 用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量(vars)、文件(file)、任务(tasks)、模块(modules)及处理器(handlers)放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。roles的作用是减少代码的复写。

二、角色集合

角色集合:roles/

phpserver/

webserver/

mysqlserver/

files/:存储由copy或script等模块调用的文件;src直接指定文件名称,不需要写绝对路径;

tasks/:此目录中至少应该有一个名为main.yaml的文件,用于定义各task;其它的文件需要由main.yaml进行“包含”调用;

handlers/:此目录中至少应该有一个名为main.yaml的文件,用于定义各handler;其它的文件需要由main.yaml进行“包含”调用;

vars/:此目录中至少应该有一个名为main.yaml的文件,用于定义各variable;其它的文件需要由main.yaml进行“包含”调用;

templates/:存储由template模块调用的模板文本;src只写文件名即可,不需要写绝对路径;

meta/:此目录中至少应该有一个名为main.yaml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yaml进行“包含”调用;

default/:此目录中至少应该有一个名为main.yaml的文件,用于设定默认变量;

site.yaml:入站文件(站点文件),用于调用roles中的角色,一般创建在roles目录下,和角色同级;也可在roles同级目录下创建playbook执行文件(yaml)

三、角色定制实例

1、在roles目录下生成对应的目录结构

[root@ren6 ~]# mkdir -pv ansible/roles/{webserver,phpserver,mysqlserver}/{files,tasks,vars,templates,handlers}

[root@ren6 ansible]# tree

2、配置角色(webserver)

(1)配置files文件:将httpd配置文件上传到files目录下(线配置一台主机)

[root@ren6 ~]# cp /etc/httpd/conf/httpd.conf ansible/roles/webserver/files/httpd.conf

(2)编写tasks任务列表

[root@ren6 ~]# vim ansible/roles/webserver/tasks/main.yaml

 1 - name: install httpd
2 yum: name=httpd state=present
3 ignore_errors: yes
4 - name: copy httpd.conf
5 copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
6 tags:
7 - conf
8 notify:
9 - restart httpd
10 - name: start httpd
11 service: name=httpd state=started
12 - name: echo http_port
13 shell: echo {{ http_port }} > /root/port.txt

(3)由于上面的tasks中定义了notify,所以要定义handlers

[root@ren6 ~]# vim ansible/roles/webserver/handlers/main.yaml

1 - name: restart httpd
2 service: name=httpd state=restarted

(4)tasks中定义了变量,需要在vars目录下创建main.yaml文件,并在文件中写入变量,以key: value的形式定义

[root@ren6 ~]# vim ansible/roles/webserver/vars/main.yaml

http_port: 88

(5)在roles下编辑站点文件site.yaml

[root@ren6 ~]# vim ansible/roles/site.yaml

1 ---
2 - hosts: 192.168.11.4
3 remote_user: root
4 roles:
5 - webserver

(6)语法检测及模拟运行

[root@ren6 ~]# ansible-playbook --syntax-check ansible/roles/site.yaml

[root@ren6 ~]# ansible-playbook -C ansible/roles/site.yaml

(7)使用模板文件templates ,复制httpd的配置文件至templates目录下

[root@ren6 ~]# cp /etc/httpd/conf/httpd.conf ansible/roles/webserver/templates/

(8)编辑templates文件

[root@ren6 ~]# vim ansible/roles/webserver/templates/httpd.conf

Listen {{ http_port }}

(9)修改tasks文件

[root@ren6 ~]# vim ansible/roles/webserver/tasks/main.yaml

- name: install httpd
yum: name=httpd state=present
ignore_errors: yes
- name: copy httpd.conf
template: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
tags:
- conf_vars
notify:
- restart httpd
- name: start httpd
service: name=httpd state=started

(10)修改站点文件

[root@ren6 ~]# vim ansible/roles/site.yaml

1 ---
2 - hosts: test1
3 remote_user: root
4 roles:
5 - webserver

(11)修改主机信息管理文件

[root@ren6 ~]# vim /etc/ansible/hosts

1 [test1]
2 192.168.11.5 ansible_ssh_user=root ansible_ssh_pass=root ansible_ssh_port=22 http_port=81
3 192.168.11.4 ansible_ssh_user=root ansible_ssh_pass=root ansible_ssh_port=22 http_port=82

(12)语法检测及运行

[root@ren6 ~]# ansible-playbook --syntax-check ansible/roles/site.yaml

[root@ren6 ~]# ansible-playbook ansible/roles/site.yaml

PLAY [test1] *************************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************
ok: [192.168.11.5]
ok: [192.168.11.4] TASK [webserver : install httpd] *****************************************************************************************************
ok: [192.168.11.5]
ok: [192.168.11.4] TASK [webserver : copy httpd.conf] ***************************************************************************************************
changed: [192.168.11.5]
changed: [192.168.11.4] TASK [webserver : start httpd] *******************************************************************************************************
changed: [192.168.11.4]
changed: [192.168.11.5] RUNNING HANDLER [webserver : restart httpd] ******************************************************************************************
changed: [192.168.11.4]
changed: [192.168.11.5] PLAY RECAP ***************************************************************************************************************************
192.168.11.4 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.11.5 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

 四、注意

1、在tasks文件下可以创建多个yaml文件,但roles只会调用main.yaml文件,所以可以用include关键字来调用其他yaml文件(- include_tasks: a.yaml)

2、roles目录下的角色名称可以随意起,不过,最好和其功能联系在一起

3、角色下的几个目录名称必须正确,s必须加上(files,tasks,vars,templates,handlers)

4、站点文件(site.yaml)内可以定义多个hosts,每个hosts下可以调用多个角色

linux中级之ansible配置(roles)的更多相关文章

  1. Linux中级之ansible配置(playbook)

    一.playbooks 如果用模块形式一般有幂等性,如果用shell或者command没有幂等性 playbooks相当于是shell脚本,可以把要执行的任务写到文件当中,一次执行,方便调用 task ...

  2. Linux中级之ansible概念及hoc命令行调用模式

    一.Ansible简介 ansible是新出现的开源的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统 ...

  3. linux中级之lvs配置(命令)

    一.nat模式配置 环境说明: DS:nat网卡(自动获取也可以,充当vip): 192.168.254.13 255.255.255.0 vmnet3网卡(仅主机): 172.16.100.1 25 ...

  4. Linux中级之keepalived配置

    hacmp: ibm的高可用集群软件,并且是商业的(收费),一般用于非x86架构机器当中 AIX,Unix 去IOE:ibm,oracle,emckeepalived: 一款高可用集群软件,利用vrr ...

  5. ansible配置mysql主从复制

    配置主机1.下载安装所需安装包 [root@server1 ansible]# lsansible-2.7.8-1.el7.noarch.rpmansible-tower-setup-bundle-3 ...

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

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

  7. 自动化运维工具Ansible之Roles测验详解

    Ansible Roles 详解与实战案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: 3. 该用 ...

  8. Linux 桌面系统字体配置要略

    字体显示效果测试 这一段是为了测试宋体字的显示效果,包括宋体里面自带的英文字体,“This is english,how does it look like?”.这一行是小字.后面几个字是加粗的宋体. ...

  9. 20145213《信息安全系统设计基础》实验一 Linux开发环境的配置

    北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级:1452 姓名: 黄亚奇 祁玮 学号:20145213 20145222 成绩: 指导教师:娄嘉鹏 实验日期:2016 ...

随机推荐

  1. Dynamics CRM使用Web Api时如果参数里面包含"&"的时候的处理方法

    当我们使用Dynamics CRM的Api的时候如果遇到查询字段的参数里面有&符号的话会影响Api的取值直接报错.原因是因为&符号在Url上面是一个关键字,这个关键字可以截断Url表示 ...

  2. 数栈SQL优化案例:隐式转换

    MySQL是当下最流行的关系型数据库之一,互联网高速发展的今天,MySQL数据库在电商.金融等诸多行业的生产系统中被广泛使用. 在实际的开发运维过程中,想必大家也常常会碰到慢SQL的困扰.一条性能不好 ...

  3. Mybatis-plus 下

    Mybatis-plus 下 查询操作 1.查询单个用户 @Test public void testSelectById(){ User user = userMapper.selectById(1 ...

  4. JavaScript深入理解-Promise以及常用方法详解

    Promise Promise 介绍 Promise 对象表示一个异步操作的最终完成(或失败)及其结果值. 状态: 一个 promise 必然处于以下几种状态之一 待定:初始状态(pending) 已 ...

  5. python工业互联网应用实战13—基于selenium的功能测试

    本章节我们再来说说测试,单元测试和功能测试.单元测试我们在数据验证章节简单提过了,本章我们进一步如何用单元测试来测试view的功能代码:同时,也涉及一下基于selenium的功能测试做法.笔者过去的项 ...

  6. Day14_82_反射机制输出整个类

    利用反射机制输出整个类 代码实例 import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class Ref ...

  7. JPA之排序条件查询

    List<Monitoring> monitoringList = repository.findAll((root, query, cb) -> { List<Predica ...

  8. 模拟退火算法(1)Python 实现

    1.模拟退火算法 模拟退火算法借鉴了统计物理学的思想,是一种简单.通用的启发式优化算法,并在理论上具有概率性全局优化性能,因而在科研和工程中得到了广泛的应用. 退火是金属从熔融状态缓慢冷却.最终达到能 ...

  9. E - Minimal Subarray Length(连续区间和)

    题目链接 题意:给出n个数,求加和大于x的最短区间的区间长度. 如果前i个数字和为y,那么如果前j数字的和小于等于y-x,那么i-j就是一种可能的情况,我们对于所有的i找出前面最大的j就可以了,因为数 ...

  10. B - 真·签到题 FZU - 2214(背包)

    Given a set of n items, each with a weight w[i] and a value v[i], determine a way to choose the item ...