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而不会产生意外副作用。使用基于状态的模块(如present、started、latest)而不是命令式命令。
等幂性(良好):
- 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配置。
工作流:
- Terraform创建AWS EC2实例、安全组、负载均衡器
- Terraform将实例IP输出到Ansible库存
- Ansible配置操作系统、安装包、部署应用程序
- 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- 从旧工具迁移到Ansiblereferences/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测试执行