Ansible Galaxy 角色复用
解读
在国内 PHP 面试中,DevOps 能力已成为中高级后端工程师的“隐形门槛”。面试官问“Ansible Galaxy 角色复用”,并不是想听你背命令,而是考察三条线:
- 你是否能把 PHP 项目的交付流程自动化(代码→包→镜像→部署)。
- 你是否具备“复用”意识:同一套角色既要能部署 Laravel 单体,也能快速落地微服务,还要兼顾测试、预发、生产三套环境。
- 你是否能把公司合规要求(等保、信创、内网源)无缝嵌入 Galaxy 角色,而不是照搬社区版本。
一句话:面试官想看“你如何用 Galaxy 角色把 PHP 项目做成可复制、可审计、可灰度的交付流水线”。
知识点
- Ansible Galaxy 本质:官方角色仓库 + ansible-galaxy CLI 工具;国内加速可用清华源或自建 Nexus 代理。
- 角色目录规范(MANDATORY):tasks/handlers/templates/files/vars/defaults/meta/README.md/tests/,meta/main.yml 中 galaxy_info 决定版本兼容性。
- 依赖解析:requirements.yml 支持 src、version、name、scm 四元组;version 可写 tag、branch、commit,利于锁定 Composer 同款“lock”效果。
- 变量优先级:defaults < vars < host_vars < group_vars < -e 传参;PHP 场景常用 group_vars/production.yml 覆盖数据库连接串。
- 标签与条件:tags: deploy,config,reload 实现“仅更新代码不重启”灰度;when: ansible_os_family == "Kylin" 适配信创。
- 角色复用粒度:
- 单层角色:php-fpm-role(装包、调内核、配池子)
- 组合角色:laravel-stack-role(依赖 php-fpm-role、nginx-role、redis-role、supervisor-role)
- CI 集成:GitLab-CI 中 ansible-lint + molecule(docker 驱动)跑单元测试;通过后才 ansible-galaxy import 到公司私有 namespace。
- 安全加固:
- no_log: true 隐藏 composer auth.json 中的 GitHub token;
- ansible-vault 加密支付密钥、OSS AK;
- 使用 become_method: sudo + 审计日志,满足等保 2.0 三级要求。
- 性能调优:
- ansible.cfg 中 pipelining=True、control_path 缩短,减少 SSH 握手;
- php-fpm-role 里内置 OPcache 黑名单模板,防止上线瞬间 502。
- 国内镜像:
- Remi 源同步到内网 Nexus;
- Composer 仓库用阿里云镜像,角色里写 composer_config 全局变量,防止外网超时。
答案
“我在上家公司把 PHP 项目的部署抽象成 5 个 Galaxy 角色,全部托管在自建的 GitLab Ansible Galaxy 上,实现‘一次编写、全业务线复用’。
- 目录规范:每个角色强制包含 molecule 测试,meta/main.yml 里写清 min_ansible_version: 2.9 及支持的 OS(CentOS 7/8、Kylin V10)。
- 依赖管理:在 laravel-stack-role/requirements.yml 中锁定 php-fpm-role:1.3.0、nginx-role:2.1.4,用 tag 而非 master,防止上游 Breaking Change。
- 变量覆盖:defaults 里给出一套‘开发环境’默认值(opcache.enable=0),而在 group_vars/production.yml 中开启 JIT 并调高 max_children,保证性能。
- 灰度发布:代码同步任务打 tag ‘code’,php-fpm reload 任务打 tag ‘reload’;上线时先 ansible-playbook -t code,验证无误后再 -t reload,做到用户无感知。
- 安全合规:composer 的 auth.json 用 ansible-vault 加密,模板里加 no_log: true;同时把 sudo 审计日志通过 rsyslog 送到 ELK,满足等保要求。
- 持续集成:GitLab-CI 里每提交自动跑 molecule converge+verify,测试通过才 ansible-galaxy import 到私有仓库;业务方只需在 requirements.yml 写一句 src: gitlab.company.com/ansible/php-fpm-role 即可复用。
- 效果:3 条业务线、8 套环境,平均部署时间从 30 分钟降到 5 分钟,全年零回滚事故。”
拓展思考
- 多 PHP 版本并存:同一台机器要跑 PHP 5.6 老项目和 PHP 8.2 新项目,如何用 Galaxy 角色实现“版本隔离+端口隔离+systemd 模板”?
- 云原生演进:把 Ansible 角色转换成 Ansible-Operator,利用 K8s CRD 管理 PHP-FPM Pod,实现“Ansible 语义 + K8s 调度”双模交付。
- 信创适配:银河麒麟、统信 UOS 的 systemd 路径、php 包名与 RHEL 不一致,怎样用 ansible_facts 动态判断并自动映射变量,保证同一套角色无需 fork?
- 回滚策略:除了保留 releases 目录,你还如何用 Ansible 把 OPcache 的 validate_timestamps 瞬时关闭、opcache_reset() 优雅调用,实现“代码回滚 + 缓存回滚”双保险?
- 成本优化:面对突发大促,你能否让 Galaxy 角色自动调用阿里云 ESS 弹性伸缩组,在扩容节点初始化完成后立即纳入 SLB,并在缩容前执行 ansible-playbook -e state=drain 做到“无损下线”?