Ansible角色中tasks的核心是将操作逻辑封装进roles/xxx/tasks/main.yml,作为角色执行入口,需声明式编写、遵循幂等性,优先用原生模块而非shell命令,并通过import_tasks拆分职责单一的子任务文件。

在 Ansible 角色中编写 tasks,核心是把具体操作逻辑封装进 roles/xxx/tasks/main.yml,并保持职责单一、结构清晰、可读性强。它不是写脚本,而是声明“系统应该变成什么样子”。
tasks/main.yml 是角色的执行入口
每个角色必须有 tasks/main.yml,Ansible 在调用该角色时默认加载这个文件。它通常不直接写大量任务,而是通过 include_tasks 或 import_tasks 拆分逻辑,便于维护。
- 用
import_tasks:适合静态加载(如初始化检查、基础依赖),Playbook 解析阶段就确定内容 - 用
include_tasks:适合动态加载(如根据变量条件决定是否执行),运行时才解析 - 推荐优先使用
import_tasks,除非需要条件控制或循环嵌套
任务编写要遵循声明式和幂等性原则
每个 - name: 应清晰表达“做什么”,而不是“怎么一步步做”。避免 shell 命令拼凑,优先用原生模块。
- ✅ 推荐:
apt: name=nginx state=present(声明目标状态) - ❌ 避免:
shell: apt-get install -y nginx(命令式、不可靠、难审计) - 安装后启动服务,应拆成两个任务:一个确保包存在,一个确保服务运行且启用
- 涉及配置变更的任务,建议加
notify:触发 handler,比如修改 Nginx 配置后重启服务
合理组织子任务文件提升可读性
当任务较多时,把功能归类到独立文件,再由 main.yml 引入:
-
tasks/install.yml:软件安装与依赖处理 -
tasks/configure.yml:配置文件分发、模板渲染 -
tasks/service.yml:服务启停、开机自启设置 -
tasks/security.yml:防火墙、SELinux、权限加固
例如 tasks/main.yml 内容可简化为:
- import_tasks: configure.yml
- import_tasks: service.yml
注意变量和条件的自然融入
任务中直接引用变量即可,无需额外声明。结合 when 可实现环境差异化处理:
when: ansible_facts['distribution'] == "CentOS"-
when: nginx_enable_ssl | bool(配合布尔型变量) - 避免硬编码路径或端口,全部抽成变量,放在
defaults/main.yml或vars/main.yml - 敏感值(如密码)不要写在 tasks 里,应通过
vars_files或 Vault 管理


















