可复用、高内聚的Ansible角色需职责单一、结构标准、变量外化、依赖显式:每个角色只做一件事(如仅部署Nginx),严格遵循目录规范,变量分层覆盖,依赖在meta中声明,组合由Playbook控制。

编写可复用、高内聚的 Ansible 角色,关键不是写得多,而是职责划得清、结构守得严、变量管得明、依赖看得见。
每个角色只做一件事,且这件事能独立验证
比如“部署 Nginx”不该包含证书管理、防火墙配置或日志轮转。它就该专注:安装、配置主 conf、启用服务、提供默认站点模板。其他能力拆成独立角色:certbot、firewall、logrotate。这样:
- 修改 SSL 流程时,只动 certbot 角色,nginx 角色完全不受影响
- 新项目要 Web 服务 + 日志清理,直接组合两个 role,不用复制粘贴任务块
- 每个角色可单独跑 Molecule 测试,验证在 CentOS 7/8、Ubuntu 20.04/22.04 上行为一致
严格遵循标准目录结构,不自定义路径
用社区广泛验证的 layout,避免协作时路径错乱。一个典型角色目录应为:
- tasks/main.yml:只放主干任务,不写 when 判断、不 include 其他角色的任务
-
defaults/main.yml:提供安全兜底值(如
nginx_listen_port: 80),允许上层用 group_vars 覆盖 -
vars/main.yml:放内部计算变量(如
nginx_conf_path: "{{ nginx_install_dir }}/conf"),不对外暴露 -
handlers/main.yml:只定义本角色触发的动作,命名带前缀(如
- restart nginx service)防冲突 -
templates/:模板文件名体现用途(
nginx.conf.j2、site-enabled-default.j2),不混用通用模板
变量必须外置,分层覆盖,禁止硬编码
所有环境相关值——IP、密码、路径、端口、版本号——一律不出现在 roles 目录里。统一走变量外化机制:
-
group_vars/all.yml:全局常量(
timezone: Asia/Shanghai、ansible_user: deploy) -
group_vars/webservers.yml:该组共性配置(
nginx_worker_processes: auto) - host_vars/app01.yml:仅用于极少数主机特例(如某台机器磁盘挂载路径不同)
- inventories/production/group_vars/webservers.yml:配合环境隔离目录,实现“同一角色在不同环境用不同变量”
依赖显式声明,组合靠 Playbook 编排
角色之间不能隐式耦合。比如 mysql 角色里不能写 include_tasks: ../common/tasks/firewall.yml。正确做法是:
- 在
meta/main.yml中声明依赖:dependencies: - { role: common, tags: ["base"] } - Playbook 中按需组合角色,控制执行顺序与条件:
- role: nginx、- role: certbot、- role: logrotate - 用 tags 控制单次运行范围(
ansible-playbook site.yml --tags "nginx,logrotate"),便于调试和灰度











