ansible roles详解

概述

Ansible Role 是标准化、可复用、分层拆分的 Playbook 工程结构,把安装、配置、文件、任务、变量、触发器等分目录管理,解决大型剧本杂乱、复用难的问题。

Role本质就是将ansible的playbook更加规范化

其核心优势:

  • 代码复用:一套 role 多台机器、多个项目直接调用
  • 结构清晰:任务 / 变量 / 模板 / 文件分离,便于维护
  • 依赖管理:role 之间可以声明依赖(meta/main.yml)
  • 统一规范:团队协作固定目录结构

Role标准目录结构

roles/
  nginx/                # 角色名:nginx
    ├── defaults/       # 默认变量(优先级最低,可被外部覆盖)
    │   └── main.yml
    ├── vars/           # 角色内部固定变量(优先级高于defaults)
    │   └── main.yml
    ├── tasks/          # 核心执行任务,必须有main.yml入口
    │   └── main.yml
    ├── handlers/      # 触发器(notify触发,如重启服务)
    │   └── main.yml
    ├── templates/     # jinja2模板文件 .j2
    │   └── nginx.conf.j2
    ├── files/         # 静态文件(直接复制,不渲染模板)
    │   └── index.html
    ├── meta/          # 角色依赖、平台声明
    │   └── main.yml
    ├── README.md      # 角色说明文档
    └── tests/         # 测试用play(可选)
        └── test.yml

核心目录详解

  • tasks/main.yml(必选):角色执行的核心步骤:安装包、创建目录、复制文件、启动服务等。
  • defaults/main.yml:Role默认参数,外部 playbook、inventory 变量可以覆盖这里的值。适合开放给使用者自定义。
  • vars/main.yml:角色内部硬编码变量,优先级高于 defaults,外部很难覆盖,存放不希望用户修改的内部参数。
  • handlers/main.yml:仅被 notify 触发,只有对应任务 changed 时才执行,常用于重启、重载服务。
  • templates/:存放 jinja2 模板,使用 template 模块渲染,支持变量插值、循环判断。
  • files/:纯静态文件,copy 模块直接推送,不做变量渲染。

第一个Role实战案例

  • 可使用ansible自带的工具ansible-galaxy初始化Role工程
# 初始化Role工程
root@master:/data00/ansible# ansible-galaxy init roles/test
- Role roles/test was created successfully

# 查看对应工程的结构
root@master:/data00/ansible# tree roles
roles
└── test
    ├── defaults
    │   └── main.yml
    ├── files
    ├── handlers
    │   └── main.yml
    ├── meta
    │   └── main.yml
    ├── README.md
    ├── tasks
    │   └── main.yml
    ├── templates
    ├── tests
    │   ├── inventory
    │   └── test.yml
    └── vars
        └── main.yml
  • 编写tasks
root@master:/data00/ansible# cat roles/test/tasks/main.yml
- name: 分发静态文件
  copy:
    src: "{{ src_file_path }}"
    dest: "{{ dest_file_path }}"
    mode: 744
    backup: true
  notify: 静态文件分发成功
  tags: copy_static

- name: 分发j2文件
  template:
    src: "{{ src_j2_file_path }}"
    dest: "{{ dest_j2_file_path }}"
    mode: 744
    backup: true
  notify: j2文件分发成功
  tags: template_j2
  • 编写handler
root@master:/data00/ansible# cat roles/test/handlers/main.yml 
# handler
- name: 静态文件分发成功
  debug:
    msg: "静态文件分发成功"
- name: j2文件分发成功
  debug:
    msg: "j2文件分发成功"
  • 配置变量
root@master:/data00/ansible# cat roles/test/vars/main.yml 
src_file_path: nginx.conf
dest_file_path: /tmp/nginx.conf
src_j2_file_path: mod.j2
dest_j2_file_path: /tmp/mod
  • 配置静态文件nginx.conf
root@master:/data00/ansible# cat roles/test/files/nginx.conf 
server {
  listen 80;
  server_name www.huangsir.com;
  root /var/www/html;
  location / {
   index index.html;
 }
}
  • 配置j2模版文件
root@master:/data00/ansible# cat roles/test/templates/mod.j2
"主机名:{{ ansible_hostname }}"
"ip:{{ ansible_all_ipv4_addresses }}"
"系统名称:{{ ansible_distribution }}"
"系统总内存:{{ ansible_memtotal_mb }}"
"系统可用内存:{{ ansible_memfree_mb }}"
"系统内存情况:{{ ansible_memory_mb }}"
"cpu总数:{{ ansible_processor_vcpus }}"
  • 编写顶层playbook
root@master:/data00/ansible# cat roles/main.yaml 
- name: 第一个roles
  hosts: es
  # 这里的test指定的是我们创建的目录名称
  roles:
  - {role: test, tags: test,mysql}
  • 也可以针对对应的roles配置主机清单文件
root@master:/data00/ansible# cat roles/hosts
[web]
10.37.99.63
10.37.120.9
[db]
10.37.99.63
[es]
10.37.120.9
  • 整体工程结构
root@master:/data00/ansible# tree roles
roles
├── hosts
├── main.yaml
└── test
    ├── defaults
    │   └── main.yml
    ├── files
    │   └── nginx.conf
    ├── handlers
    │   └── main.yml
    ├── meta
    │   └── main.yml
    ├── README.md
    ├── tasks
    │   └── main.yml
    ├── templates
    │   └── mod.j2
    ├── tests
    │   ├── inventory
    │   └── test.yml
    └── vars
        └── main.yml
  • 测试运行role

运行role和运行剧本没什么区别,直接使用ansible-playbook命令运行即可

# -i指定清单文件
root@master:/data00/ansible# ansible-playbook  -i roles/hosts roles/main.yaml 

PLAY [第一个roles] ***********************************************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************************************
ok: [10.37.120.9]

TASK [test : 分发静态文件] ***************************************************************************************************************************************************************************************
changed: [10.37.120.9]

TASK [test : 分发j2文件] *****************************************************************************************************************************************************************************************
[WARNING]: Deprecation warnings can be disabled by setting `deprecation_warnings=False` in ansible.cfg.
[DEPRECATION WARNING]: INJECT_FACTS_AS_VARS default to `True` is deprecated, top-level facts will not be auto injected after the change. This feature will be removed from ansible-core version 2.24.
Origin: /data00/ansible/roles/test/templates/mod.j2

Use `ansible_facts["fact_name"]` (no `ansible_` prefix) instead.

changed: [10.37.120.9]

RUNNING HANDLER [test : 静态文件分发成功] ************************************************************************************************************************************************************************
ok: [10.37.120.9] => {
    "msg": "静态文件分发成功"
}

RUNNING HANDLER [test : j2文件分发成功] **************************************************************************************************************************************************************************
ok: [10.37.120.9] => {
    "msg": "j2文件分发成功"
}

PLAY RECAP *******************************************************************************************************************************************************************************************************
10.37.120.9                : ok=5    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

role仓库之Galaxy

Ansible Galaxy 是官方统一角色仓库平台:https://galaxy.ansible.com
类似于GitHub,我们可以在这个平台上搜索别人写好的roles,然后下载到本地使用。

核心命令:

# 在线搜索 nginx 相关角色
ansible-galaxy search nginx

# 查看角色详情(namespace.角色名)
ansible-galaxy info geerlingguy.nginx

# 格式:作者.角色名
ansible-galaxy install geerlingguy.nginx

# 指定版本安装
ansible-galaxy install geerlingguy.nginx,3.1.0

# -p 指定安装目录(项目内 roles 文件夹,推荐生产使用)
ansible-galaxy install geerlingguy.nginx -p ./roles

# --force 强制覆盖已存在角色
ansible-galaxy install geerlingguy.nginx -p ./roles --force

# 列出默认路径所有角色
ansible-galaxy list

# 指定目录查看项目内角色
ansible-galaxy list -p ./roles

# 删除角色
ansible-galaxy remove geerlingguy.nginx -p ./roles


# 自己本地使用
# 在当前目录生成完整规范role目录
ansible-galaxy role init my_nginx

# 指定生成路径
ansible-galaxy role init redis --init-path ./roles
posted @ 2026-07-16 10:20  huangSir-devops  阅读(75)  评论(0)    收藏  举报
作者:你的名字
出处:你的博客链接
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。