在Ansible Playbook中引入自定义角色需确保路径正确、结构规范,并通过roles列表或import_role/include_role声明;角色目录须含tasks/main.yml等标准子目录,变量可直接传入,动态调用时import_role支持when和tags,include_role支持loop。

在 Ansible Playbook 中引入和调用自定义角色,核心是确保角色路径正确、结构规范,并在 playbook 中用 roles 或 import_role/include_role 声明。
确认角色目录结构合法
Ansible 要求自定义角色遵循标准布局。例如,名为 myapp_setup 的角色应位于 roles/myapp_setup/ 下,且包含至少以下子目录:
-
tasks/main.yml(必需,角色主任务入口) -
handlers/main.yml(可选) -
defaults/main.yml(可选,提供默认变量) -
vars/main.yml(可选,定义角色内部变量)
若角色不在默认 roles/ 目录下,需通过 roles_path 配置或命令行 --roles-path 指定搜索路径。
在 Playbook 中直接使用 roles 列表
这是最常用、最清晰的方式,适合静态调用。Playbook 示例:
---
- name: Deploy web application
hosts: webservers
roles:
- role: myapp_setup
app_port: 8080
app_user: deployer
- role: nginx_config
nginx_sites: ["default", "api"]
说明:
- 每个
- role: xxx行会自动加载roles/xxx/tasks/main.yml - 可在 role 条目后直接传入变量(如
app_port),这些变量作用于该角色全部任务 - 多个角色按顺序执行,前一个角色定义的 fact 或 handler 可被后一个角色使用
动态调用:import_role 和 include_role
当需要条件执行、循环调用或延迟加载时,用 import_role(静态解析,支持 when、tags)或 include_role(动态执行,支持 loop、vars 覆盖):
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
---
- name: Conditional role execution
hosts: all
tasks:
- name: Run db setup only on prod
import_role:
name: database_init
when: env == "prod"
<pre class="brush:php;toolbar:false;">- name: Apply config per service
include_role:
name: config_deploy
loop: "{{ services }}"
vars:
config_name: "{{ item }}"
注意:
-
import_role在 playbook 解析阶段展开,支持notify、tags、when;不能在loop内使用 -
include_role在运行时加载,支持loop、vars动态覆盖,但notify处理更受限 - 两者都要求角色名与目录名严格一致(如
name: myrole对应roles/myrole/)
验证角色是否被正确识别
运行前可用以下方式快速检查:
-
ansible-playbook site.yml --list-roles:列出所有将被加载的角色 -
ansible-playbook site.yml --syntax-check:检查语法及角色路径是否存在 - 启用调试:
ANSIBLE_VERBOSITY=2 ansible-playbook site.yml,观察是否打印importing role...
常见报错如 ERROR! the role 'xxx' was not found,通常因路径不对、目录名拼写错误或未在 roles_path 中声明。










