← 返回主页
案例 01
Ansible 自动化运维平台从零搭建

背景描述

某公司管理 300+ 台 Linux 服务器,配置变更全靠手工 SSH 登录执行,新服务器上线需半天手动配置。需搭建 Ansible 自动化管理平台。

解决方案

搭建 Ansible Control Node,配置动态 Inventory(从 CMDB 获取主机列表),编写标准化 Roles(系统初始化、安全加固、监控接入、业务部署)。新服务器上线 10 分钟完成。

技术要点

  • Inventory 插件动态获取主机,按环境/角色分组
  • Role 标准化:common(基础)→ security(安全)→ monitor(监控)→ app(业务)
  • Playbook 幂等性保证:使用 state: present/absent 而非 command/shell
  • Ansible Vault 加密敏感信息(密码、密钥)
# ansible.cfg [defaults] inventory = inventory/ host_key_checking = False forks = 50 gathering = smart roles_path = roles/ vault_password_file = .vault_pass # 动态 Inventory 脚本示例(CMDB 查询) #!/usr/bin/env python3 # inventory.py --list import json inventory = { "_meta": {"hostvars": {}}, "prod": {"hosts": ["192.168.10.11", "192.168.10.12"]}, "staging": {"hosts": ["192.168.20.11"]}, "webserver": {"hosts": ["192.168.10.11"]}, "database": {"hosts": ["192.168.10.12"]} } print(json.dumps(inventory)) # 标准化 Playbook - 新服务器初始化 - hosts: new_servers become: yes roles: - role: common # 基础配置:yum 源、常用工具、NTP - role: security # 安全加固:SSH、fail2ban、firewalld - role: monitor # 监控接入:node_exporter - role: app # 应用部署:按 group_vars 决定具体应用 # Role 示例:common/tasks/main.yml - name: Install base packages yum: name: "{{ base_packages }}" state: present vars: base_packages: - vim htop iotop sysstat net-tools chrony - jq tree telnet tcpdump bind-utils
案例 02
批量安全合规基线推送

背景描述

等保测评要求全公司 300+ 台服务器在 2 周内完成安全基线统一整改(密码策略、账户锁定、审计日志、内核参数)。手工逐台执行无法按期完成。

解决方案

编写 Ansible security Role,聚合所有安全基线配置项。按批次(每批 30 台)灰度执行,每批执行后验证合规度并修复异常。通过 ansible-lint 确保 Playbook 质量。

技术要点

  • 配置项模板化:使用 Jinja2 模板管理不同环境的差异
  • 灰度发布:serial: 30 控制每次执行 30 台
  • 验证回调:执行后自动运行安全扫描脚本验证合规度
  • ansible-lint + ansible-playbook --check 预检查
# 安全基线 Playbook(灰度执行) - hosts: all become: yes serial: 30 # 每批 30 台 max_fail_percentage: 10 # 超过 10% 失败则停止 roles: - security # security Role 关键任务 - name: Set password policies lineinfile: path: /etc/security/pwquality.conf regexp: "^{{ item.key }}" line: "{{ item.key }} = {{ item.value }}" loop: - { key: 'minlen', value: '12' } - { key: 'minclass', value: '4' } - name: Configure auditd rules template: src: audit.rules.j2 dest: /etc/audit/rules.d/audit.rules notify: restart auditd # 预检查(不实际执行) ansible-playbook security.yml --check --diff ansible-lint security.yml
案例 03
多环境应用批量发布与回滚

背景描述

某 SaaS 平台每周发版需在 4 个环境(dev/test/staging/prod)部署 12 个微服务,每环境部署步骤和参数不同。之前手工执行,偶尔出现漏步、参数错配。

解决方案

使用 Ansible group_vars 管理各环境差异(端口、副本数、DB 地址),编写 deploy.yml 一键部署到目标环境。结合 git commit hash 做版本追溯,支持一键回滚。

技术要点

  • group_vars/{dev,test,staging,prod}.yml 管理环境差异
  • 通过 --extra-vars "version=" 指定部署版本
  • 回滚机制:保留最近 5 个版本的部署包,回滚即切换软链接
  • 部署后自动执行冒烟测试脚本验证
# group_vars/prod.yml app_port: 8080 replicas: 4 db_host: "prod-db-master.internal.com" redis_host: "prod-redis-cluster.internal.com" nacos_addr: "nacos-prod.internal.com:8848" # deploy.yml - hosts: "{{ target_env }}" vars: app_version: "{{ version | default('latest') }}" deploy_dir: "/opt/app/{{ app_name }}" versions_dir: "{{ deploy_dir }}/versions" tasks: - name: Create deploy directories file: { path: "{{ item }}", state: directory, owner: app } loop: - "{{ deploy_dir }}" - "{{ versions_dir }}" - name: Deploy new version copy: src: "builds/{{ app_name }}-{{ app_version }}.tar.gz" dest: "{{ versions_dir }}/" - name: Extract and switch symlink shell: | cd {{ versions_dir }} tar xzf {{ app_name }}-{{ app_version }}.tar.gz ln -sfn {{ app_name }}-{{ app_version }} {{ deploy_dir }}/current - name: Restart service systemd: { name: "{{ app_name }}", state: restarted, daemon_reload: yes } - name: Smoke test uri: url: "http://localhost:{{ app_port }}/health" status_code: 200 retries: 10 delay: 3 - name: Cleanup old versions (keep last 5) shell: | cd {{ versions_dir }} && ls -t | tail -n +6 | xargs -r rm -rf