写点什么

Ansible 自动化部署工具 -role 模式安装 filebeat 实际案例分析

  • 2023-11-13
    福建
  • 本文字数:2885 字

    阅读完需:约 9 分钟

语法以及实际案例


平时我们在进行日志收集的时候,往往会在每台机器上安装 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 中的版本号即可。


文章转载自: 蓝胖子的编程梦

原文链接:https://www.cnblogs.com/hobbybear/p/17824585.html

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
Ansible自动化部署工具-role模式安装filebeat实际案例分析_自动化部署_快乐非自愿限量之名_InfoQ写作社区