Ansible Galaxy 角色复用

解读

在国内 PHP 面试中,DevOps 能力已成为中高级后端工程师的“隐形门槛”。面试官问“Ansible Galaxy 角色复用”,并不是想听你背命令,而是考察三条线:

  1. 你是否能把 PHP 项目的交付流程自动化(代码→包→镜像→部署)。
  2. 你是否具备“复用”意识:同一套角色既要能部署 Laravel 单体,也能快速落地微服务,还要兼顾测试、预发、生产三套环境。
  3. 你是否能把公司合规要求(等保、信创、内网源)无缝嵌入 Galaxy 角色,而不是照搬社区版本。

一句话:面试官想看“你如何用 Galaxy 角色把 PHP 项目做成可复制、可审计、可灰度的交付流水线”。

知识点

  1. Ansible Galaxy 本质:官方角色仓库 + ansible-galaxy CLI 工具;国内加速可用清华源或自建 Nexus 代理。
  2. 角色目录规范(MANDATORY):tasks/handlers/templates/files/vars/defaults/meta/README.md/tests/,meta/main.yml 中 galaxy_info 决定版本兼容性。
  3. 依赖解析:requirements.yml 支持 src、version、name、scm 四元组;version 可写 tag、branch、commit,利于锁定 Composer 同款“lock”效果。
  4. 变量优先级:defaults < vars < host_vars < group_vars < -e 传参;PHP 场景常用 group_vars/production.yml 覆盖数据库连接串。
  5. 标签与条件:tags: deploy,config,reload 实现“仅更新代码不重启”灰度;when: ansible_os_family == "Kylin" 适配信创。
  6. 角色复用粒度:
    • 单层角色:php-fpm-role(装包、调内核、配池子)
    • 组合角色:laravel-stack-role(依赖 php-fpm-role、nginx-role、redis-role、supervisor-role)
  7. CI 集成:GitLab-CI 中 ansible-lint + molecule(docker 驱动)跑单元测试;通过后才 ansible-galaxy import 到公司私有 namespace。
  8. 安全加固:
    • no_log: true 隐藏 composer auth.json 中的 GitHub token;
    • ansible-vault 加密支付密钥、OSS AK;
    • 使用 become_method: sudo + 审计日志,满足等保 2.0 三级要求。
  9. 性能调优:
    • ansible.cfg 中 pipelining=True、control_path 缩短,减少 SSH 握手;
    • php-fpm-role 里内置 OPcache 黑名单模板,防止上线瞬间 502。
  10. 国内镜像:
    • Remi 源同步到内网 Nexus;
    • Composer 仓库用阿里云镜像,角色里写 composer_config 全局变量,防止外网超时。

答案

“我在上家公司把 PHP 项目的部署抽象成 5 个 Galaxy 角色,全部托管在自建的 GitLab Ansible Galaxy 上,实现‘一次编写、全业务线复用’。

  1. 目录规范:每个角色强制包含 molecule 测试,meta/main.yml 里写清 min_ansible_version: 2.9 及支持的 OS(CentOS 7/8、Kylin V10)。
  2. 依赖管理:在 laravel-stack-role/requirements.yml 中锁定 php-fpm-role:1.3.0、nginx-role:2.1.4,用 tag 而非 master,防止上游 Breaking Change。
  3. 变量覆盖:defaults 里给出一套‘开发环境’默认值(opcache.enable=0),而在 group_vars/production.yml 中开启 JIT 并调高 max_children,保证性能。
  4. 灰度发布:代码同步任务打 tag ‘code’,php-fpm reload 任务打 tag ‘reload’;上线时先 ansible-playbook -t code,验证无误后再 -t reload,做到用户无感知。
  5. 安全合规:composer 的 auth.json 用 ansible-vault 加密,模板里加 no_log: true;同时把 sudo 审计日志通过 rsyslog 送到 ELK,满足等保要求。
  6. 持续集成:GitLab-CI 里每提交自动跑 molecule converge+verify,测试通过才 ansible-galaxy import 到私有仓库;业务方只需在 requirements.yml 写一句 src: gitlab.company.com/ansible/php-fpm-role 即可复用。
  7. 效果:3 条业务线、8 套环境,平均部署时间从 30 分钟降到 5 分钟,全年零回滚事故。”

拓展思考

  1. 多 PHP 版本并存:同一台机器要跑 PHP 5.6 老项目和 PHP 8.2 新项目,如何用 Galaxy 角色实现“版本隔离+端口隔离+systemd 模板”?
  2. 云原生演进:把 Ansible 角色转换成 Ansible-Operator,利用 K8s CRD 管理 PHP-FPM Pod,实现“Ansible 语义 + K8s 调度”双模交付。
  3. 信创适配:银河麒麟、统信 UOS 的 systemd 路径、php 包名与 RHEL 不一致,怎样用 ansible_facts 动态判断并自动映射变量,保证同一套角色无需 fork?
  4. 回滚策略:除了保留 releases 目录,你还如何用 Ansible 把 OPcache 的 validate_timestamps 瞬时关闭、opcache_reset() 优雅调用,实现“代码回滚 + 缓存回滚”双保险?
  5. 成本优化:面对突发大促,你能否让 Galaxy 角色自动调用阿里云 ESS 弹性伸缩组,在扩容节点初始化完成后立即纳入 SLB,并在缩容前执行 ansible-playbook -e state=drain 做到“无损下线”?