配置管理Skill managing-configuration

这个技能专注于使用Ansible和相关工具进行自动化配置管理,涵盖Playbook创建、角色设计、库存管理、秘密保护和测试验证,适用于DevOps和基础设施自动化场景,确保安全、可重复的配置部署。关键词:Ansible, 配置管理, 自动化, DevOps, Playbook, 角色, 库存, 秘密管理, 测试

DevOps 0 次安装 0 次浏览 更新于 3/23/2026

name: 配置管理 description: 指导用户使用Ansible创建、管理和测试服务器配置自动化。当自动化服务器配置、使用Ansible Playbook部署应用程序、管理云环境的动态库存或用Molecule测试角色时,此技能提供等幂性模式、使用ansible-vault和HashiCorp Vault的秘密管理,以及配置即代码的GitOps工作流。

配置管理

目的

此技能提供使用Ansible和相关工具自动化服务器和应用程序配置的指导。它涵盖Playbook创建、角色结构、库存管理(静态和动态)、秘密管理、测试模式和等幂性最佳实践,以确保安全、可重复的配置部署。

何时使用此技能

在以下情况调用此技能:

  • 创建Ansible Playbook以配置服务器或部署应用程序
  • 构建具有适当目录布局的可重用Ansible角色
  • 管理库存(静态文件或动态云基础)
  • 使用ansible-vault或HashiCorp Vault集成保护秘密
  • 在生产部署前使用Molecule测试角色
  • 确保等幂性Playbook可以安全地运行多次
  • 从Chef或Puppet迁移到Ansible
  • 实施配置即代码的GitOps工作流
  • 调试Playbook失败或处理程序问题

快速入门

基本Playbook示例

---
# site.yml
- name: 配置Web服务器
  hosts: webservers
  become: yes

  tasks:
    - name: 确保nginx已安装
      apt:
        name: nginx
        state: present
      notify: 重启nginx

    - name: 启动nginx服务
      service:
        name: nginx
        state: started
        enabled: yes

  handlers:
    - name: 重启nginx
      service:
        name: nginx
        state: restarted

运行:

ansible-playbook -i inventory/production site.yml

核心概念

1. 等幂性

多次运行Playbook而不会产生意外副作用。使用基于状态的模块(如presentstartedlatest)而不是命令式命令。

等幂性(良好):

- name: 确保包已安装
  apt:
    name: nginx
    state: present

非等幂性(避免):

- name: 安装包
  command: apt-get install -y nginx

参见references/idempotency-guide.md以获取详细模式。

2. 库存管理

静态库存: INI或YAML文件用于稳定环境。 动态库存: 脚本或插件用于云环境(AWS、Azure、GCP)。

静态库存示例(INI):

[webservers]
web1.example.com ansible_host=10.0.1.10
web2.example.com ansible_host=10.0.1.11

[webservers:vars]
nginx_worker_processes=4

参见references/inventory-management.md以获取动态库存设置。

3. 角色与Playbook

Playbook: 编排多个任务和角色以进行特定部署。 角色: 可重用、自包含的配置单元,具有标准化目录结构。

标准角色结构:

roles/nginx/
├── defaults/     # 默认变量
├── tasks/        # 任务文件
├── handlers/     # 更改处理程序
├── templates/    # Jinja2模板
├── files/        # 静态文件
└── meta/         # 依赖关系

参见references/role-structure.md以获取完整角色模式。

4. 秘密管理

ansible-vault: 内置加密用于敏感数据。 HashiCorp Vault: 企业级秘密管理,具有动态凭据。

加密秘密:

ansible-vault create group_vars/all/vault.yml
ansible-playbook site.yml --ask-vault-pass

参见references/secrets-management.md以获取Vault集成。

常见工作流

工作流1:创建新Playbook

步骤1: 定义库存

# inventory/production
[webservers]
web1.example.com
web2.example.com

步骤2: 创建Playbook结构

---
- name: 配置应用程序
  hosts: webservers
  become: yes

  pre_tasks:
    - name: 更新包缓存
      apt:
        update_cache: yes

  roles:
    - common
    - application

  post_tasks:
    - name: 验证服务
      uri:
        url: http://localhost:8080/health
        status_code: 200

步骤3: 使用检查模式测试

ansible-playbook -i inventory/production site.yml --check --diff

步骤4: 执行Playbook

ansible-playbook -i inventory/production site.yml

参见references/playbook-patterns.md以获取高级模式。

工作流2:创建和测试角色

步骤1: 初始化角色结构

ansible-galaxy init roles/myapp

步骤2: 定义任务

# roles/myapp/tasks/main.yml
---
- name: 安装应用程序依赖项
  apt:
    name: "{{ item }}"
    state: present
  loop: "{{ myapp_dependencies }}"

- name: 部署应用程序
  template:
    src: app.conf.j2
    dest: /etc/myapp/app.conf
  notify: 重启myapp

步骤3: 添加处理程序

# roles/myapp/handlers/main.yml
---
- name: 重启myapp
  service:
    name: myapp
    state: restarted

步骤4: 初始化Molecule测试

cd roles/myapp
molecule init scenario default --driver-name docker

步骤5: 运行测试

molecule test

参见references/testing-guide.md以获取全面测试模式。

工作流3:设置动态库存(AWS)

步骤1: 安装AWS集合

ansible-galaxy collection install amazon.aws

步骤2: 配置动态库存

# inventory/aws_ec2.yml
plugin: aws_ec2
regions:
  - us-east-1
filters:
  tag:Environment: production
  instance-state-name: running
keyed_groups:
  - key: tags.Role
    prefix: role
hostnames:
  - tag:Name
compose:
  ansible_host: private_ip_address

步骤3: 验证库存

ansible-inventory -i inventory/aws_ec2.yml --list

步骤4: 运行Playbook

ansible-playbook -i inventory/aws_ec2.yml site.yml

参见references/inventory-management.md以获取多云模式。

工作流4:使用ansible-vault保护秘密

步骤1: 创建加密的保险库文件

ansible-vault create group_vars/all/vault.yml

步骤2: 添加秘密

# group_vars/all/vault.yml (加密)
vault_db_password: "SuperSecretPassword"
vault_api_key: "sk-1234567890"

步骤3: 在变量中引用

# group_vars/all/vars.yml (未加密)
db_password: "{{ vault_db_password }}"
api_key: "{{ vault_api_key }}"

步骤4: 在Playbook中使用

- name: 配置数据库
  template:
    src: db.conf.j2
    dest: /etc/app/db.conf
  vars:
    database_password: "{{ db_password }}"

步骤5: 使用保险库密码运行

ansible-playbook site.yml --vault-password-file ~/.vault_pass

参见references/secrets-management.md以获取HashiCorp Vault集成。

工具选择

何时使用Ansible

  • 在配置后配置服务器/虚拟机
  • 将应用程序部署到现有基础设施
  • 管理操作系统级设置(用户、包、服务)
  • 跨主机编排多步骤工作流
  • 云原生环境(无代理SSH/WinRM)
  • 新接触配置管理的团队(学习曲线最简单)

何时使用替代方案

基础设施即代码(Terraform): 创建云基础设施资源。 Kubernetes: 容器编排和配置。 Chef/Puppet: 现有部署,迁移成本高。

Ansible与IaC集成

最佳实践:Terraform提供基础设施,Ansible配置。

工作流:

  1. Terraform创建AWS EC2实例、安全组、负载均衡器
  2. Terraform将实例IP输出到Ansible库存
  3. Ansible配置操作系统、安装包、部署应用程序
  4. Ansible设置监控、备份、操作任务

参见references/decision-framework.md以获取详细决策树。

测试与质量

预部署验证

步骤1: 检查Playbook

ansible-lint playbooks/

步骤2: 检查模式(干运行)

ansible-playbook site.yml --check --diff

步骤3: 使用Molecule测试角色

cd roles/myapp
molecule test

步骤4: 验证等幂性

molecule idempotence

配置文件

.ansible-lint:

---
exclude_paths:
  - molecule/
  - venv/
skip_list:
  - name[casing]
warn_list:
  - experimental

molecule.yml:

---
driver:
  name: docker
platforms:
  - name: instance
    image: ubuntu:22.04
    pre_build_image: true
provisioner:
  name: ansible
verifier:
  name: ansible

参见references/testing-guide.md以获取完整测试策略。

故障排除

常见问题

连接失败:

  • 验证SSH访问:ansible all -i inventory -m ping
  • 检查SSH密钥:ssh -vvv user@host
  • 使用密码测试:ansible-playbook site.yml --ask-pass

处理程序未触发:

  • 处理程序仅在更改时运行(检查任务changed状态)
  • 处理程序在Playbook结束时运行(使用meta: flush_handlers强制提前运行)
  • 处理程序名称必须完全匹配

变量未定义:

  • 检查变量优先级(命令行 > Playbook > 库存 > 默认值)
  • 使用调试模块:- debug: var=myvar
  • 验证变量文件已加载:ansible-playbook site.yml -v

等幂性违规:

  • 运行Playbook两次,比较输出
  • 检查每次运行是否有changed
  • 使用基于状态的模块而不是command/shell

参见references/troubleshooting.md以获取全面调试指南。

与其他技能集成

基础设施即代码:

  • Terraform提供基础设施
  • Ansible配置后提供配置
  • Terraform输出馈送到Ansible库存

Kubernetes操作:

  • Ansible部署K8s集群(kubespray)
  • Kubernetes处理容器编排
  • Ansible管理节点级配置

构建CI/CD管道:

  • CI/CD运行ansible-lint进行质量检查
  • Molecule测试在管道中执行
  • 部署阶段运行Playbooks

秘密管理:

  • ansible-vault用于简单用例
  • HashiCorp Vault用于企业秘密
  • 通过Vault查找动态凭据

安全加固:

  • Ansible应用CIS基准
  • 安全角色强制执行合规性
  • Molecule验证加固效果

测试策略:

  • Molecule用于角色测试
  • Testinfra用于验证
  • 集成测试套件

参考文档

  • references/playbook-patterns.md - Playbook结构、处理程序、标签、变量
  • references/role-structure.md - 角色目录布局、最佳实践、集合
  • references/inventory-management.md - 静态、动态和混合库存模式
  • references/secrets-management.md - ansible-vault和HashiCorp Vault集成
  • references/testing-guide.md - Molecule、ansible-lint、检查模式、验证
  • references/idempotency-guide.md - 确保安全、可重复的执行
  • references/decision-framework.md - 工具选择和工作流设计
  • references/chef-puppet-migration.md - 从旧工具迁移到Ansible
  • references/troubleshooting.md - 常见问题和调试技术

示例代码

  • examples/playbooks/ - 完整Playbook示例
  • examples/roles/ - 生产就绪的角色模板
  • examples/inventory/ - 静态和动态库存配置
  • examples/molecule/ - Molecule测试场景

实用脚本

  • scripts/validate-playbook.py - 验证Playbook语法和结构
  • scripts/generate-inventory.py - 从云提供商生成库存
  • scripts/ansible-vault-helper.sh - 保险库管理工具
  • scripts/molecule-runner.sh - 自动化Molecule测试执行