Ansible 自动化运维实战系列(五):Roles详解

发布于:2025-08-15 ⋅ 阅读:(15) ⋅ 点赞:(0)

📚 系列导航

👉 第一篇:概述、部署与命令
👉 第二篇:主机清单详解
👉 第三篇:常用模块详解
👉 第四篇:Playbook详解
👉 第五篇:Roles详解
👉 第六篇:Valut详解
👉 第七篇:Galaxy详解


一:概述

roles 是一种用来模块化组织 Playbook 的机制,就像是把一堆散落的任务(tasks)、变量(vars)、模板(templates)等文件,按照固定的目录结构打包成一个“功能模块”。

如果 Playbook 里的内容越来越多,所有任务、模板、变量都写在一个文件里,会变得杂乱且难以维护。
roles 帮你:

  • 按功能拆分(比如 webserver、database、common)
  • 提高复用性(同一个 role 可在不同项目直接使用)
  • 方便团队协作(不同人负责不同 role)

二:初始化

1)创建目录

[root@m01 ansible]# mkdir -p playbook/roles

2)初始化

  • 自动创建

    ansible-galaxy init <role>:官方提供的脚手架

    [root@m01 ansible]# cd playbook/roles/
    [root@m01 roles]# ansible-galaxy init nfs-server
    - Role nfs-server was created successfully
    
  • 手动创建

    [root@m01 module]# cd playbook/roles/
    [root@m01 roles]# mkdir -p rsync-server/{tasks,files,templates,handlers}
    

三:目录结构

roles/
  └─ myrole/
	    ├── defaults                # 默认变量目录(优先级最低,可被外部覆盖)
        │   └── main.yml             # - 定义默认值,比如端口、路径等
        ├── files                   # 存放要直接复制到目标主机的静态文件
        ├── handlers                # 存放处理器(handlers),用于 notify 触发的任务
        │   └── main.yml             # - 例如“重启 nginx”这种操作
        ├── meta                    # 存放角色的元信息
        │   └── main.yml             # - 依赖的其他 roles、作者信息等
        ├── README.md               # 角色说明文档(变量说明、使用方法等)
        ├── tasks                   # 主要任务目录(核心执行逻辑)
        │   └── main.yml             # - 必须存在,定义具体的任务步骤
        ├── templates               # 存放 Jinja2 模板(可渲染变量的配置文件)
        ├── tests                   # 角色测试目录
        │   ├── inventory            # - 测试用的主机清单
        │   └── test.yml             # - 测试用的 playbook
        └── vars                    # 固定变量目录(优先级高,不易被覆盖)
            └── main.yml             # - 定义不希望被轻易改动的变量

四:案例

通过 roles 实现 nfs-server 在指定组的机器部署

1)初始化 nfs-server role

[root@m01 roles]# ansible-galaxy init nfs-server

2)编写 role

  • 编写 /roles/nfs-server/tasks/install.yml 剧本

    [root@m01 roles]# vim nfs-server/tasks/install.yml
    - name: "01 install nfs-utils rpcbind"
      yum:
        name: "nfs-utils,rpcbind"
        state: "present"
      tags:
        - "01 install"
    
  • 编写 /roles/nfs-server/tasks/config.yml 剧本

    [root@m01 roles]# vim nfs-server/tasks/config.yml
    - name: "02 vim file"
      lineinfile:
        path: "/etc/exports"
        line: "/backup-nfs/ 172.16.1.0/24(rw,all_squash)"
        create: true
      tags:
        - "02 vim file"
    
    - name: "03 create dir"
      file:
        path: "/backup-nfs"
        owner: "nfsnobody"
        group: "nfsnobody"
        state: "directory"
      tags:
        - "03 create dir"
    
  • 编写 /roles/nfs-server/tasks/start.yml 剧本

    [root@m01 roles]# vim nfs-server/tasks/start.yml
    - name: "04 start rpc nfs"
      systemd:
        name: "{{ item }}"
        enabled: "yes"
        state: "started"
      loop:
        - "rpcbind"
        - "nfs"
      tags:
        - "04 start rpc nfs"
    
  • 编写 /roles/nfs-server/tasks/main.yml 剧本

    可以直接在剧本中使用 inclued,不使用 role

    ---
    - hosts: backup
      tasks:
        - include_tasks: install.yml
        - include_tasks: config.yml
        - include_tasks: start.yml
    
    [root@m01 roles]# vim nfs-server/tasks/main.yml
    ---
    - include_tasks: install.yml
    - include_tasks: config.yml
    - include_tasks: start.yml
    

3)编写 nfs-server.yml 剧本文件

[root@m01 roles]# vim nfs-server.yml
- hosts: backup
  roles:
    - role: nfs-server

4)执行 nfs-server.yml 剧本文件

[root@m01 roles]# ansible-playbook nfs-server.yml

总结

1 概述
用途:模块化组织 Ansible 剧本,便于复用与维护
结构:tasks + vars + handlers + templates + files + meta

2 核心案例
🆕 初始化 Role:ansible-galaxy init <role_name>
📂 编辑 Role:在 tasks/main.yml 中编写任务
🖋 编写主剧本:nfs-server.yml 调用 role
▶ 执行剧本:ansible-playbook nfs-server.yml

3 目录结构
📂 tasks:主要任务列表
📂 handlers:事件触发任务
📂 vars:变量定义
📂 templates:模板文件(Jinja2)
📂 files:静态文件
📂 meta:依赖声明

4 流程
1️⃣ 创建 Role 目录
2️⃣ 初始化 Role
3️⃣ 编写任务文件
4️⃣ 编写主剧本
5️⃣ 执行验证

5 提示与技巧
🛠 使用 --syntax-check 检查语法
🚀 使用 --step 单步执行
🎯 使用 --tags 只运行部分任务
⚠ 忽略错误:ignore_errors
🔄 循环与条件:loop、when


网站公告

今日签到

点亮在社区的每一天
去签到