大家好,我是蓝胖子,前面一节我简单的讲了讲Ansible的架构和编排任务的语法,可以发现,通过playbook方式编排任务时,能够将任务文档化,但是在面对比较复杂且不同业务的任务编排时,维护playbook就变得复杂,所以Ansible产生了role模式针对复杂的任务进行编排工作。今天我们就通过一个实际的案例来看看如何使用role模式。

语法以及实际案例

平时我们在进行日志收集的时候,往往会在每台机器上安装filebeat,并且由于每台机器运行服务的不同,那么收集日志的配置文件也是不一样的,如何快速高效的部署filebeat以及拥有不同的配置文件就是我们要思考的问题,当然不可能一台机器一台机器的修改配置文件。

接下来我将会以一个我自己写的filebeat相关的role举例,来分析role模式涉及的一些规范以及如何写一个好的任务编排, 案例中的filebeat的role模式拥有对filebeat的安装,更新配置的功能。

role其实是对之前使用playbook的文件目录进行了一些规范(比如必须有roles目录且和playbook入口文件在同一位置,roles目录下的各个特定role的目录也是固定命名的)

代码已经上传github

https://github.com/HobbyBear/ansible-role-filebeat.git

整个项目的目录结构如下所示,filebeatop.yml到时候是我们执行ansible playbook命令的入口文件,我们可以使用这样的命令使用这个role , ansible-playbook -i hosts filebeatop.yml ,其中hosts目录就是存放inventory主机清单。

.
├── ReadMe.md
├── filebeatop.yml
├── group_vars
│   └── test.yml
├── hosts
│   ├── prod
│   └── test
└── roles
└── filebeat
├── handlers
│   └── main.yml
├── tasks
│   ├── install.yml
│   ├── main.yml
│   ├── rpm.yml
│   └── updatecfg.yml
└── templates
├── debug.conf
├── filebeatbox.yml
└── log.yml

filebeatop.yml 的内容如下,其中roles配置项可以配置多个role,不过案例中就只配置了一个filebeat的role,这个role的名称就是上述roles目录下的filebeat这个文件夹的名称。同时filebeatop.yml同时设置了变量version和logstashendpoint,不同的是version变量是role级别的。

- hosts: test
roles:
- role: filebeat
version : '7.14.2'
vars:
logstashendpoint: 192.168.0.2:5054

接着了解下roles目录的结构,filebeat 就代表一个role,其下有handlers,tasks,templates目录,它们存放的内容如下,

roles
└── filebeat
├── handlers
│   └── main.yml
├── tasks
│   ├── install.yml
│   ├── main.yml
│   ├── rpm.yml
│   └── updatecfg.yml
└── templates
├── debug.conf
├── filebeatbox.yml
└── log.yml
  • tasks 里面存放具体的Ansible 的各种模块定义的任务,其入口文件是main.yml 它里面可以通过include 引入其他task。就比如这个案例中,我在main.yml 引入了其他配置文件定义的任务。main.yml 代码如下, 可以看到在引入其他配置文件定义的任务时,我还用tags为任务打上了标签,这个标签可以让我们后续根据特定的标签执行任务。
-  include: install.yml
tags:
- install - include: rpm.yml
tags:
- rpm - include: updatecfg.yml
tags:
- updatecfg
  • handlers 目录下存放任务的后续处理逻辑,它其实也是ansible的模块定义的各种任务,与tasks不同的是,它是专门放到tasks执行后执行的。例如在handlers的main.yml文件中,我定义了一个名为restart Filebeat service 的handler,handlers/main.yml代码如下

become 设置为yes,become_method 设置为sudo 代表在运行这个service的命令时是要以sudo权限运行的。

- name: restart Filebeat service
become: yes
become_method: sudo
service:
name: filebeat
enabled: yes
state: restarted

这个handler在tasks/updatecfg.yml中有被用到,如下,在更新完filebeat服务配置后,通过notify配置,定义所需的handler的名称,便可以在特定task执行完成后运行对应的handler。

- name: 更新服务配置
shell: "sudo systemctl daemon-reload"
notify:
- restart Filebeat service
  • templates 目录存放的是某些需要用到的配置文件模板,在模板文件中可以使用{{ 变量名 }} 引用,变量的定义可以在前面filebeatop.yml文件中vars,或者roles配置中定义,也可以放到与hosts目录同级的group_vars 目录中定义,Ansible 关于变量的定义方式有很多种,这里就不展开了。 拿案例中的group_vars举例,其目录下的文件名是inventory主机清单中的机器组的名称,比如我这里有个test的机器组,所以我在group_vars有个test.yml文件,内容如下,定义了两个变量 log_path和log_type。
log_path: "- /home/webserver/logs/box-api/box-api.log\r\n    - /home/webserver/logs/box-bsk/box-bsk.log\r\n    - /home/webserver/logs/box-flow/box-flow.log"  

log_type:
box

这两个变量被 templates目录下的log.yml文件所引用。log.yml文件内容如下(是一个典型的filebeat设置日志采集路径的配置)

- type: log
tail_files: true
paths:
{{ log_path}}
fields:
log_type: {{ log_type }}

如何使用这些模板文件呢,其实就是通过ansible的template模块,拿filebeat role中的updatecfg.yml定义的任务片段举例,将filebeat 相关的配置文件上传到主机上对应的目录。

- name: 传送配置文件
become: yes
become_method: sudo
template: src=log.yml dest=/home/webserver/local/filebeat-{{ version }}-linux-x86_64/log.yml owner=root group=root - name: 传送配置文件
become: yes
become_method: sudo
template: src=filebeatbox.yml dest=/home/webserver/local/filebeat-{{ version }}-linux-x86_64/filebeatbox.yml owner=root group=root

思考如何利用role模式写好Ansible的任务编排

简单介绍完整个案例的目录和相关的文件后,我们从使用角度来分析如何写一个好的部署任务。

像上述案例中,我们可以执行下面的命令执行相应的部署,更新配置任务。

在filebeatop.yml 中指定要操作的机器组,以及filebeat的版本,日志输出的logstahsh端点。 在group_vars 中定义每个机器组上需要采集的日志路径

安装filebeat软件包

ansible-playbook -i hosts    filebeatop.yml --tags "install"

安装filebeat service

ansible-playbook -i hosts    filebeatop.yml --tags "rpm"

更新filebeat配置文件

ansible-playbook -i hosts    filebeatop.yml --tags "updatecfg"

通过filebeat/tasks 引入其他任务配置文件时的 tags去区分要执行的任务,而整个role中则定义对应的组件相关的操作,这样能更好的维护对应组件的部署配置任务。

并且让roles相关的文件 只负责部署,而针对哪些机器部署的配置则从roles目录中分离出来,形成变量。这样的好处在于,后续对于其他机器组的配置,相同组件的不同版本的配置都可以不用去动roles目录下的文件了,只需要新增不同的机器组的变量或者修改filebeatop.yml中的版本号即可。

Ansible自动化部署工具-role模式安装filebeat实际案例分析的更多相关文章

  1. Ansible自动化部署K8S集群

    Ansible自动化部署K8S集群 1.1 Ansible介绍 Ansible是一种IT自动化工具.它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部署,滚动更新.Ansible适用于管理企 ...

  2. Jenkins+Gitlab+Ansible自动化部署(三)

    接Jenkins+Gitlab+Ansible自动化部署(一)https://www.cnblogs.com/zd520pyx1314/p/10210727.html 和(二)https://www. ...

  3. Ansible批量部署工具

    Ansible:自动化运维工具 你需要在一台机器上yum install 一个包,这时候有一个需求,比如现在有5台机同时需要装apache这个包,那么100台呢,ssh上去就太慢了,这时候就借助到了a ...

  4. CentOS7系统 ansible自动化部署多台服务器部署

    CentOS7系统 ansible自动化部署多台服务器部署   Ansible工作机制  从图中可以看出ansible分为以下几个部份: 1> Control Node:控制机器2> In ...

  5. Jenkins+Gitlab+Ansible自动化部署(六)

    Pipeline Job实现Nginix+MySQL+PHP+Wordpress实现自动化部署交付(Jenkins+Gitlab+Ansible自动化部署(五)https://www.cnblogs. ...

  6. Jenkins+Gitlab+Ansible自动化部署(一)

    首先准备实验环境 虚拟机 主机名 IP地址 服务 系统版本 内核版本 Vmware Workstation 14 gitlab.example.com 192.168.244.130 gitlab  ...

  7. Jenkins+Gitlab+Ansible自动化部署(四)

    接Jenkins+Gitlab+Ansible自动化部署(三)https://www.cnblogs.com/zd520pyx1314/p/10235394.html Jenkins应用 Jenkin ...

  8. Linux(四)—— 项目部署与ansible自动化部署

    目录 项目部署与ansible自动化部署 一.项目部署 二.ansible自动化部署(python自动化运维) 1.安装ansible 2.ansible例子 3.ansible自动化部署nginx ...

  9. 在服务器上搭建Jenkins自动化部署工具

    在公司发现很多时候都需要手动部署,然后有天听到自动部署这个词想着有没有什么工具能够自动部署项目,最好能自动化部署前后端生成 docker images 运行方便管理.最后经过我各种筛查,发现用 jen ...

  10. 自动化部署教程(一) redhat安装jenkins

    自动化部署教程(一)  redhat安装jenkins 源配置: sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.or ...

随机推荐

  1. OceanBase 分布式存储管理

    分布式存储管理 分区表管理 定义 把普通的表的数据按照一定的规则划分到不同的区块内,同一区块的数据物理上存储在一起. 每个分区还能按照一定的规则再拆分成多个分区,这种分区表叫做二级分区表. 分区分类 ...

  2. 奇分频电路如何实现? 负沿触发&非负沿触发

    请设计一个奇分频电路,占空比为50%? 以下给出解答: 1.带负沿触发 module div //带负沿触发 #(parameter N = 5) //定义分频参数 ( input sys_clk , ...

  3. docker下nginx配置

    一步一坑安装docker  nginx 首先选择适当版本镜像下载 我选的: nginx:1.16.0 docker pull nginx:1.16.0 安装完毕之后创建挂载文件夹 : mkdir /u ...

  4. [golang]使用gocron编写定时任务

    前言 linux自带的crontab默认情况下只能精确到分钟,没法执行秒级任务.当然,也不是不行,比如: * * * * * for i in $(seq 1 11);do echo hello &g ...

  5. React Router@3.x 升级到 @6.x 的实施方案

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:景明 升级背景 目前公司产品有关 react 的工具版本普 ...

  6. 【升职加薪秘籍】我在服务监控方面的实践(7)-业务维度的redis监控

    大家好,我是蓝胖子,关于性能分析的视频和文章我也大大小小出了有一二十篇了,算是已经有了一个系列,之前的代码已经上传到github.com/HobbyBear/performance-analyze,接 ...

  7. 搭建企业知识库:基于 Wiki.js 的实践指南

    一.简介 在当今知识经济时代,企业知识库的建设变得越来越重要.它不仅有助于企业知识的沉淀和共享,还能提升员工的工作效率,促进企业的创新发展.企业知识库是企业中形成结构化文档,共享知识的集群,可以促进企 ...

  8. minio 支持object搜索方案

    minio支持上传时对object打标签,查询时可以根据标签做筛选.但是有ftp上传文件的需求,导致无法给object打标签.并且也不清楚minio对于根据标签的筛选性能如何,因此我们打算将objec ...

  9. SpringBoot + 自定义注解,实现用户操作日志(支持SpEL表达式)

    背景 一个成熟的系统,都会针对一些关键的操作,去创建用户操作日志. 比如: XX人创建了一条订单,订单号:XXXXXXXXX 因为操作人或者订单号是动态的,所以有些开发人员,不知道获取,就将这种操作日 ...

  10. 使用HTML一键打包EXE工具打包KRPANO全景项目

    HTML一键打包EXE工具(HTML封装EXE, HTML转EXE)能把任意HTML项目(网址)一键打包为单个EXE文件,可以脱离浏览器和服务器,直接双击即可运行. 打包工具群:429338543 最 ...