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


    大家好,我是蓝胖子,前面一节我简单的讲了讲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
    
    • 1

    整个项目的目录结构如下所示,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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    接着了解下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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    - name: 更新服务配置  
      shell: "sudo systemctl daemon-reload"  
      notify:  
        - restart Filebeat service
    
    • 1
    • 2
    • 3
    • 4
    • 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
    
    • 1
    • 2
    • 3
    • 4

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

    - type: log  
      tail_files: true  
      paths:  
        {{ log_path}}  
      fields:  
        log_type: {{ log_type }}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    如何使用这些模板文件呢,其实就是通过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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

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

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

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

    安装filebeat软件包

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

    安装filebeat service

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

    更新filebeat配置文件

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

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

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

  • 相关阅读:
    xcode配置swift使用自定义主题颜色或者使用RGB或者HEX颜色
    Linux 系统之 CentOS 和 Ubuntu 的区别
    k8s遇到的错误记录
    【Android安全】Binder解析
    HTML学生个人网站作业设计 明星易烊千玺介绍(HTML+CSS) web前端开发技术 web课程设计 网页规划与设计
    JavaEE初阶Day 13:多线程(11)
    Python输入输出、遍历文件夹(input、stdin、os.path)
    什么是职业规划?如何进行职业规划?
    动手学强化学习第2章多臂老虎机
    Solaris 9 Sparc下安装整合Apache2和Tomcat5
  • 原文地址:https://blog.csdn.net/qq_34675369/article/details/134337420