Ansible 自动化部署工具 -role 模式安装 filebeat 实际案例分析
语法以及实际案例
平时我们在进行日志收集的时候,往往会在每台机器上安装 filebeat,并且由于每台机器运行服务的不同,那么收集日志的配置文件也是不一样的,如何快速高效的部署 filebeat 以及拥有不同的配置文件就是我们要思考的问题,当然不可能一台机器一台机器的修改配置文件。
接下来我将会以一个我自己写的 filebeat 相关的 role 举例,来分析 role 模式涉及的一些规范以及如何写一个好的任务编排, 案例中的 filebeat 的 role 模式拥有对 filebeat 的安装,更新配置的功能。
role 其实是对之前使用 playbook 的文件目录进行了一些规范(比如必须有 roles 目录且和 playbook 入口文件在同一位置,roles 目录下的各个特定 role 的目录也是固定命名的)。
代码已经上传 github
整个项目的目录结构如下所示,filebeatop.yml 到时候是我们执行 ansible playbook 命令的入口文件,我们可以使用这样的命令使用这个 role , ansible-playbook -i hosts filebeatop.yml ,其中 hosts 目录就是存放 inventory 主机清单。
filebeatop.yml 的内容如下,其中 roles 配置项可以配置多个 role,不过案例中就只配置了一个 filebeat 的 role,这个 role 的名称就是上述 roles 目录下的 filebeat 这个文件夹的名称。同时 filebeatop.yml 同时设置了变量 version 和 logstashendpoint,不同的是 version 变量是 role 级别的。
接着了解下 roles 目录的结构,filebeat 就代表一个 role,其下有 handlers,tasks,templates 目录,它们存放的内容如下,
tasks 里面存放具体的 Ansible 的各种模块定义的任务,其入口文件是 main.yml 它里面可以通过 include 引入其他 task。就比如这个案例中,我在 main.yml 引入了其他配置文件定义的任务。main.yml 代码如下, 可以看到在引入其他配置文件定义的任务时,我还用 tags 为任务打上了标签,这个标签可以让我们后续根据特定的标签执行任务。
handlers 目录下存放任务的后续处理逻辑,它其实也是 ansible 的模块定义的各种任务,与 tasks 不同的是,它是专门放到 tasks 执行后执行的。例如在 handlers 的 main.yml 文件中,我定义了一个名为 restart Filebeat service 的 handler,handlers/main.yml 代码如下
become 设置为 yes,become_method 设置为 sudo 代表在运行这个 service 的命令时是要以 sudo 权限运行的。
这个 handler 在 tasks/updatecfg.yml 中有被用到,如下,在更新完 filebeat 服务配置后,通过 notify 配置,定义所需的 handler 的名称,便可以在特定 task 执行完成后运行对应的 handler。
templates 目录存放的是某些需要用到的配置文件模板,在模板文件中可以使用{{ 变量名 }} 引用,变量的定义可以在前面 filebeatop.yml 文件中 vars,或者 roles 配置中定义,也可以放到与 hosts 目录同级的 group_vars 目录中定义,Ansible 关于变量的定义方式有很多种,这里就不展开了。 拿案例中的 group_vars 举例,其目录下的文件名是 inventory 主机清单中的机器组的名称,比如我这里有个 test 的机器组,所以我在 group_vars 有个 test.yml 文件,内容如下,定义了两个变量 log_path 和 log_type。
这两个变量被 templates 目录下的 log.yml 文件所引用。log.yml 文件内容如下(是一个典型的 filebeat 设置日志采集路径的配置)
如何使用这些模板文件呢,其实就是通过 ansible 的 template 模块,拿 filebeat role 中的 updatecfg.yml 定义的任务片段举例,将 filebeat 相关的配置文件上传到主机上对应的目录。
🤔思考如何利用 role 模式写好 Ansible 的任务编排
简单介绍完整个案例的目录和相关的文件后,我们从使用角度来分析如何写一个好的部署任务。
像上述案例中,我们可以执行下面的命令执行相应的部署,更新配置任务。
在 filebeatop.yml 中指定要操作的机器组,以及 filebeat 的版本,日志输出的 logstahsh 端点。 在 group_vars 中定义每个机器组上需要采集的日志路径
安装 filebeat 软件包
安装 filebeat service
更新 filebeat 配置文件
通过 filebeat/tasks 引入其他任务配置文件时的 tags 去区分要执行的任务,而整个 role 中则定义对应的组件相关的操作,这样能更好的维护对应组件的部署配置任务。
并且让 roles 相关的文件 只负责部署,而针对哪些机器部署的配置则从 roles 目录中分离出来,形成变量。这样的好处在于,后续对于其他机器组的配置,相同组件的不同版本的配置都可以不用去动 roles 目录下的文件了,只需要新增不同的机器组的变量或者修改 filebeatop.yml 中的版本号即可。
文章转载自: 蓝胖子的编程梦
评论