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