当前位置:首页>Linux>Linux 服务自动化运维与配置管理:Ansible 实战进阶

Linux 服务自动化运维与配置管理:Ansible 实战进阶

  • 2026-10-11 06:02:48
Linux 服务自动化运维与配置管理:Ansible 实战进阶

Linux 服务自动化运维与配置管理:Ansible 实战进阶

一、Ansible 架构原理与核心优势

Ansible 工作原理:

  • Control Node(控制节点):安装 Ansible 的管理机(通常一台 Linux 服务器)
  • Managed Nodes(被管节点):通过 SSH 连接,无需安装 Agent
  • Modules:核心执行单元(service、template、copy、yum、systemd 等)
  • Plugins:扩展功能(连接插件、回调插件等)
  • Inventory:主机清单
  • Playbook:YAML 格式的任务编排

核心优势(运维视角):

  1. Agentless:无需在目标机安装额外软件,降低安全风险
  2. 幂等性:重复执行结果一致,避免重复配置
  3. 声明式:描述“期望状态”而非具体步骤
  4. 可读性强:YAML 格式,易于版本控制
  5. 生态丰富:数千个 Roles(Galaxy)、集成 Prometheus、Docker、Kubernetes 等
  6. 与 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 自动化部署

  • 创建用户、授权、配置主从复制
  • 使用 community.mysql 模块

4. 高可用组件自动化

  • Keepalived 配置模板化
  • HAProxy 后端动态发现(通过 inventory)

5. 零停机滚动更新

-name:Drainandupdateserversonebyone
serial:1
tasks:
-name:RemovefromHAProxy
...
-name:Deploynewversion
...
-name:Healthcheck
uri:
url:"http://{{ inventory_hostname }}/health"

八、生产环境 Ansible 最佳实践与高级功能

  1. 性能优化:

    • 使用 Mitogen 策略加速(pip install mitogen)
    • 分批执行(serial)
    • 异步任务 + polling
  2. 权限与安全:

    • 专用 ansible 用户 + sudo 最小权限
    • 禁止 become: yes 在敏感 Playbook 中滥用
    • 启用 no_log: true 隐藏敏感输出
  3. CI/CD 集成:

    • GitLab CI / GitHub Actions + Ansible
    • Molecule + TestInfra 做 Role 测试
    • AWX / Ansible Tower 提供 Web 界面和 RBAC
  4. 大规模管理(1000+ 节点):

    • 使用动态 Inventory(AWS、VMware、自定义脚本)
    • 分组 + 标签管理
    • Ansible Pull 模式(节点主动拉取)
  5. 日志与审计:

    • 开启 callback 插件记录所有操作
    • 集成 ELK 分析变更历史

九、常见 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。

最新文章

随机文章