提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
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.yml
、inventory
、extra-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
任务准备的静态文件
下载已经写好的角色
网上有很多已经写好的角色,可以直接拿来使用,以下是网址: