Linux 服务自动化运维与配置管理:Ansible 实战进阶
一、Ansible 架构原理与核心优势
Ansible 工作原理:
- Control Node(控制节点):安装 Ansible 的管理机(通常一台 Linux 服务器)
- Managed Nodes(被管节点):通过 SSH 连接,无需安装 Agent
- Modules:核心执行单元(service、template、copy、yum、systemd 等)
核心优势(运维视角):
- Agentless:无需在目标机安装额外软件,降低安全风险
- 生态丰富:数千个 Roles(Galaxy)、集成 Prometheus、Docker、Kubernetes 等
- 与 Systemd 完美结合:可直接管理服务单元文件、daemon-reload 等
版本推荐:Ansible 2.14+ 或 Ansible Core + Ansible Navigator(现代方式)
二、安装、配置与基础命令
1. 控制节点安装
# CentOS/Rocky Linux
yum install epel-release -y
yum install ansible-core -y
# Ubuntu
apt update && apt install ansible -y
# 配置 SSH 免密(推荐使用专用运维账号)
ssh-keygen -t ed25519
ssh-copy-id ansible@192.168.1.10
2. 基础 Inventory(/etc/ansible/hosts)
[webservers]
web01 ansible_host=192.168.1.11 ansible_user=ansible
web02 ansible_host=192.168.1.12 ansible_user=ansible
[dbservers]
db01 ansible_host=192.168.1.21
[all:vars]
ansible_ssh_private_key_file=/home/ansible/.ssh/id_ed25519
3. Ad-Hoc 命令(临时任务)
ansible all -m ping
ansible webservers -m command -a "systemctl status nginx"
ansible dbservers -m yum -a "name=mysql state=latest" --become
ansible all -m setup --tree /tmp/facts # 收集事实
三、Playbook 编写进阶技巧
1. 完整 Playbook 示例(部署 Nginx 服务)
---
-name:DeployNginxwithSystemd
hosts:webservers
become:yes
vars:
nginx_port:80
nginx_worker_processes:"{{ ansible_processor_vcpus }}"
tasks:
-name:InstallNginx
yum:
name:nginx
state:present
-name:TemplateNginxconfig
template:
src:nginx.conf.j2
dest:/etc/nginx/nginx.conf
owner:root
mode:'0644'
notify:ReloadNginx
-name:Deploycustomservicedrop-in
template:
src:nginx-override.conf.j2
dest:/etc/systemd/system/nginx.service.d/override.conf
notify:
-Daemonreload
-RestartNginx
handlers:
-name:Daemonreload
systemd:
daemon_reload:yes
-name:ReloadNginx
systemd:
name:nginx
state:reloaded
-name:RestartNginx
systemd:
name:nginx
state:restarted
2. 变量管理优先级(从高到低)
- extra-vars(-e) > host/group vars > role vars > playbook vars > defaults
3. 条件、循环与过滤器
-name:OnlyonCentOS
yum:
name:nginx
state:present
when:ansible_os_family=="RedHat"
-name:Createmultipleinstances
systemd:
name:"app@{{ item }}.service"
enabled:yes
state:started
loop:"{{ range(8080, 8085) | list }}"
四、Roles 复用与项目结构最佳实践
推荐生产项目结构:
ansible-project/
├── inventory/
│ ├── production
│ └── staging
├── group_vars/
├── host_vars/
├── roles/
│ ├── common/ # 基础配置(时区、用户、监控)
│ ├── nginx/
│ ├── mysql/
│ ├── prometheus/
│ └── keepalived/
├── playbooks/
│ ├── deploy_nginx.yml
│ └── deploy_db.yml
├── templates/
├── files/
├── ansible.cfg
└── requirements.yml # 依赖外部 roles
创建 Role:
ansible-galaxy init roles/nginx
nginx Role 的 tasks/main.yml 示例:
---
-name:IncludeOSspecificvariables
include_vars:
file:"{{ ansible_os_family }}.yml"
-import_tasks:install.yml
-import_tasks:configure.yml
-import_tasks:systemd.yml
-import_tasks:security.yml
使用 Galaxy 优秀 Roles:
# requirements.yml
-src:geerlingguy.nginx
-src:geerlingguy.mysql
五、Jinja2 模板与动态配置
nginx.conf.j2 模板:
worker_processes {{ nginx_worker_processes }};
events {
worker_connections 1024;
}
http {
server {
listen {{ nginx_port }};
server_name {{ inventory_hostname }};
location / {
proxy_pass http://backend_{{ env }};
}
location /health {
return 200 "ok";
}
}
}
变量与事实结合:
- 使用
ansible_facts 动态适配不同硬件 lookup('file', ...)、vault 加密敏感信息
六、Ansible Vault 安全管理
ansible-vault create group_vars/all/vault.yml
ansible-vault edit group_vars/all/vault.yml
ansible-playbook site.yml --ask-vault-pass
# 或使用 --vault-password-file
生产建议:将 Vault 密钥存放在密码管理器或 HashiCorp Vault 中,通过 CI/CD 注入。
七、与 Linux 服务深度集成实战
1. Systemd 服务批量管理 Role
-name:ManageSystemdservices
systemd:
name:"{{ item.service }}"
state:"{{ item.state | default('started') }}"
enabled:"{{ item.enabled | default(true) }}"
daemon_reload:yes
loop:"{{ systemd_services }}"
2. Prometheus 监控自动注册 部署 node_exporter + 添加 Prometheus 配置。
3. MySQL 自动化部署
4. 高可用组件自动化
- HAProxy 后端动态发现(通过 inventory)
5. 零停机滚动更新
-name:Drainandupdateserversonebyone
serial:1
tasks:
-name:RemovefromHAProxy
...
-name:Deploynewversion
...
-name:Healthcheck
uri:
url:"http://{{ inventory_hostname }}/health"
八、生产环境 Ansible 最佳实践与高级功能
- 使用 Mitogen 策略加速(pip install mitogen)
- 专用 ansible 用户 + sudo 最小权限
- 禁止
become: yes 在敏感 Playbook 中滥用
- GitLab CI / GitHub Actions + Ansible
- Molecule + TestInfra 做 Role 测试
- AWX / Ansible Tower 提供 Web 界面和 RBAC
- 使用动态 Inventory(AWS、VMware、自定义脚本)
九、常见 Ansible 故障排查案例
案例1:SSH 连接超时 解决:配置 ansible_ssh_common_args、增加 Timeout、检查防火墙。
案例2:模板渲染失败 排查:ansible-playbook --syntax-check、debug 模块打印变量。
案例3:幂等性失效 原因:模块使用不当(如 command 代替 shell)。 解决:优先使用 service、template、copy 等声明式模块。
案例4:变量覆盖混乱 解决:使用 ansible-inventory --graph --vars 查看最终变量。
案例5:大规模执行卡死 优化:forks=50、pipelining=True、fact_caching。