ansible角色依赖通过meta/main.yml的dependencies键声明,按序加载且仅执行一次;依赖角色须预先存在或已下载,不支持jinja2动态语法,执行顺序自上而下并递归解析。

在 Ansible 角色中配置依赖关系,核心是通过 meta/main.yml 文件声明该角色所依赖的其他角色。Ansible 在执行当前角色前,会自动按顺序加载并运行所有已声明的依赖角色,且仅加载一次(即使多个角色都依赖同一个角色)。
依赖关系写在 meta/main.yml 中
每个角色的 meta/main.yml 是定义依赖的唯一位置。文件必须是 YAML 格式,使用 dependencies 键列出所需角色,每项至少包含 role 字段:
- role 名称必须准确匹配被依赖角色的目录名或 Galaxy 名(如
geerlingguy.nginx或本地nginx) - 可选添加
version指定版本(适用于 Galaxy 角色) - 支持传入
vars覆盖被依赖角色的默认变量
示例:roles/wordpress/meta/main.yml
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
---
dependencies:
- role: nginx
vars:
nginx_vhosts:
- server_name: wordpress.local
root: /var/www/html
- role: php_fpm
version: "8.2"
依赖角色必须可被 Ansible 找到
Ansible 不会自动下载或安装依赖角色,它只负责按声明顺序调用。因此需确保:
- 本地依赖角色已存在于
roles/目录下(如roles/nginx/),或 - Galaxy 角色已通过
ansible-galaxy install下载到本地(如ansible-galaxy install geerlingguy.nginx),或 - 在
ansible.cfg中正确设置了roles_path,让 Ansible 知道去哪里找这些角色
依赖不支持条件判断和循环
dependencies 列表是静态的,不能使用 Jinja2 变量、when 条件或 loop 动态生成。如果需要差异化依赖逻辑(比如“仅在 RedHat 系统上依赖 selinux-role”),应改用 import_role 或 include_role 在 tasks/main.yml 中动态控制,而不是写在 meta/main.yml 里。
依赖执行顺序与幂等性
Ansible 按 dependencies 列表从上到下的顺序执行依赖角色,每个依赖角色自身也会递归解析其 meta/main.yml 中的依赖。所有依赖角色均在当前角色的 tasks 运行前完成。依赖角色的执行遵循 Ansible 的幂等原则——多次运行不会重复生效,但变量传递和 handler 触发仍需按需设计。










