Ansible进阶使用-role角色用法介绍

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

Ansible 角色是一种组织 playbook 的方式,旨在简化管理和重复使用 Ansible 配置。角色是基于约定的目录结构来组织任务、文件、变量、默认值、模板和handlers的一种方法。

每个角色通常专注于实现特定的功能或配置一组相关的设置。例如,你可能会有一个 web 角色用于部署 web 应用程序,或者一个 database 角色用于配置数据库服务器。

使用角色的好处包括但不限于:

  • 可重用性:一旦创建了一个角色,它可以在多个项目中重用。
  • 共享:角色可以通过 Ansible Galaxy 分享给社区中的其他人。
  • 模块化:将复杂的部署过程分解成更小、更易管理的部分。
  • 清晰度:通过明确的角色结构,更容易理解每个部分的职责。

使用方法

通常我们需要准备额外3个文件:

  • run_role.yml:主函数

    ---
    - hosts: all
      gather_facts: yes
      vars_files:
        - extra-data.json
      roles:
        - role: filebeat
          vars:
            app_manager_op: "install"
            app_system_user: "{{ ansible_ssh_user }}"
            input_items: "{{ customConfig.input_items }}"
            ES_HOST: "{{ customConfig.esHost }}"
            ES_PORT: "{{ customConfig.esPort }}"
            ES_USER: "{{ customConfig.esUser }}"
            ES_PASS: "{{ customConfig.esPassword }}"
            ES_PROTOCOL: "{{ customConfig.esProtocol }}"
    
  • inventory:主机清单

    192.168.56.56 ansible_ssh_port=2202 ansible_ssh_user='root'  ansible_ssh_pass='admin@VM123'  ansible_become_password='admin@VM123' 
    
  • extra-data.json:参数文件

    {
      "customConfig":{
        "input_items":[
          {
            "paths":[
              "/var/log/messages"
            ],
            "pattern":"^[[:space:]]",
            "fields":{
              "logType": "sys_log",
    	        "applicationName": "message"
            }
          },
          {
            "paths":[
              "/var/log/secure"
            ],
            "fields":{
              "logType": "sys_log",
    	        "applicationName": "secure"
            }
          }
        ],
        "esHost": "192.168.20.42",
        "esPort": 9200,
        "esProtocol": "https",
        "esUser": "elastic",
        "esPassword": "CEU8rzk*C16zOh=95THx"
      }
    
    }
    

role文件夹需要提前放到Ansible项目的roles/目录下,run_role.ymlinventoryextra-data.json 可以放在同一个目录下,这样可以直接引用它无需担心路径问题!

/home/root/ansible/test/
│
├── run_role.yml
├── inventory
└── extra-data.json

切换到目录执行如下命令:

cd /home/root/ansible/test/
ansible-playbook -i inventory run_role.yml

项目结构

关于filebeat角色,它可能并不是在这个playbook文件中直接定义的,而是通常会放在Ansible项目的roles/目录下,或者通过Git仓库等其他方式引入。每个角色一般包含几个标准的子目录,如tasks/, handlers/, templates/, files/, vars/, defaults/, 和meta/,其中tasks/main.yml是最关键的部分,它定义了该角色要执行的任务序列。

一个典型的 Ansible 角色目录结构如下:

my_role/
├── files/               # 为任务准备的静态文件
├── tasks/               # 主要的任务列表,main.yml 是默认入口文件
├── templates/           # Jinja2 模板文件,用于生成配置文件等
├── vars/                # 角色使用的变量定义
├── defaults/            # 默认变量,可以被用户覆盖
├── meta/                # 角色依赖元数据,比如依赖其他角色
└── handlers/            # handler 定义,通常用于重启服务等操作

tasks

tasks/
├── disable.yml
├── install.yml
├── main.yml
├── set_role_variables.yml
└── uninstall.yml

tasks里面定义了本角色主要的任务列表,其他模块内部可以调用这里的任务;

tasks/main.yml是最关键的部分,它定义了该角色要执行的任务序列。

---
# tasks file for app
- name: 检测系统环境信息,设置相关变量
  include_tasks: set_role_variables.yml
- block:

    - name: 安装 {{ app_name }}
      include_tasks: install.yml
      when:
        app_manager_op =='install'

    - name: 禁用 {{ app_name }}
      include_tasks: disable.yml
      when:
        app_manager_op =='disable'

    - name: 卸载 {{ app_name }}
      include_tasks: uninstall.yml
      when:
        app_manager_op =='uninstall'
  when:
    app_manager_op is defined

defaults

defaults/
└── main.yml

配置role内部变量的一些默认值,如前文的中的{{ app_name }}变量就来自于defaults/main.yml

---
# defaults file for filebeat
app_version: 8.9.0
app_name: "filebeat"
app_service_name: "auto_agent_{{ app_name }}"
# Internal variables.
app_system_group: "auto-op"
app_system_user: "auto-op"
app_binary_install_dir: "/home/{{ app_system_user }}/auto_agent/app/{{ app_service_name }}"
app_config_dir: "{{ app_binary_install_dir }}/conf"
binary_tgz_name: "filebeat-8.9.0.linux-amd64"
app_manager_op: "install"

input_items:
  - paths:
      - /var/log/*.log
    fields:
      host_ip: "{{ inventory_hostname }}"
      server_type: "system_log"

ES_HOST: "127.0.0.1"
ES_PORT: 9200
ES_PROTOCOL: "https"
ES_USER: "elastic"
ES_PASS: "elastic"

handlers

handlers/
└── main.yml

handlers 是 Ansible 中一种特殊的任务列表,它们通常用于在特定事件发生时执行某些操作。与常规任务不同的是,handlers 只有在被显式通知notify:(即被触发)的情况下才会运行,并且即使多次被通知,也只会运行一次。这使得 handlers 特别适合用来重启服务、重新加载守护进程等不需要频繁执行的操作。

---
# handlers file for filebeat
- name: restart filebeat system
  listen: "restart filebeat"
  become: true
  ansible.builtin.systemd:
    daemon_reload: true
    name: "{{ app_service_name }}"
    state: restarted
  when: use_systemd|bool

- name: restart filebeat service
  listen: "restart filebeat"
  become: true
  ansible.builtin.service:
    name: "{{ app_service_name }}"
    state: restarted
  when: not use_systemd|bool

两个触发器(handlers)都监听相同的标签 "restart blackbox",当任何一个任务通过 notify: "restart blackbox" 来通知时,都会考虑这两个 handler。但是,实际执行哪一个 handler 取决于条件表达式 when

meta

meta/ 目录是 Ansible 角色的一部分,主要用于定义角色的依赖关系和其他元数据。在 meta/ 目录下,通常会有一个名为 main.yml 的文件,它包含了有关角色的信息,例如:

  • 依赖的角色:指定当前角色依赖的其他角色。
  • Galaxy 元数据:提供给 Ansible Galaxy 使用的信息,如角色的作者、许可协议、最小的 Ansible 版本要求等。

templates

应用所需要的jinja2模板文件

templates/
├── app.service.j2
├── app.sh.j2
└── blackbox.yml.j2

files

任务准备的静态文件

下载已经写好的角色

网上有很多已经写好的角色,可以直接拿来使用,以下是网址:

Ansible Galaxy - Welcome to Galaxy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值