概述
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文件分发成功"
- name: 静态文件分发成功
-
配置变量
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}
- name: 第一个roles
-
也可以针对对应的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