Ansible自动化运维与配置管理深度实践

Ansible架构与核心概念

Ansible是一款开源的IT自动化工具,采用无Agent架构,仅通过SSH连接目标主机即可完成配置管理、应用部署和任务编排。与Puppet、Chef等需要安装Agent的工具相比,Ansible的部署成本极低,只需在控制节点安装Ansible,目标主机无需任何额外配置。

Ansible的核心组件包括:

  • Inventory:主机清单,定义被管理主机的分组与连接信息
  • Modules:功能模块,如yum、copy、service、file等,是实际执行操作的单元
  • Playbook:YAML格式的任务编排文件,定义配置与部署流程
  • Roles:可复用的任务组织结构,将变量、任务、模板等按标准目录组织
  • Filters/Plugins:数据过滤器和插件,扩展Ansible的处理能力

Inventory主机清单配置

静态Inventory使用INI或YAML格式定义主机分组:

# inventory/production.ini
[webservers]
web[01:03].example.com ansible_user=deploy ansible_port=22

[dbservers]
db01.example.com ansible_user=dbadmin
db02.example.com ansible_user=dbadmin

[appservers:children]
webservers
dbservers

[all:vars]
ansible_python_interpreter=/usr/bin/python3
env=production

动态Inventory适用于云环境,实时获取主机列表:

#!/usr/bin/env python3
import json, subprocess

def get_aws_instances():
    result = subprocess.run(
        ["aws", "ec2", "describe-instances",
         "--filters", "Name=tag:Env,Values=production",
         "--query", "Reservations[].Instances[].{id:InstanceId,ip:PrivateIpAddress}"],
        capture_output=True, text=True
    )
    return json.loads(result.stdout)

def main():
    instances = get_aws_instances()
    inventory = {
        "_meta": {"hostvars": {}},
        "aws_production": {
            "hosts": [],
            "vars": {"ansible_user": "ec2-user"}
        }
    }
    for inst in instances:
        inventory["aws_production"]["hosts"].append(inst["ip"])
    print(json.dumps(inventory))

if __name__ == "__main__":
    main()

Playbook编写与最佳实践

Playbook是Ansible的核心,以下展示一个完整的Nginx部署Playbook:

---
- name: Deploy and configure Nginx
  hosts: webservers
  become: true
  vars:
    nginx_version: "1.24.0"
    nginx_worker_processes: "auto"
    nginx_max_connections: 2048
    server_name: "{{ inventory_hostname }}"
    upstream_servers:
      - 127.0.0.1:8000
      - 127.0.0.1:8001

  pre_tasks:
    - name: Validate Ansible version
      assert:
        that:
          - ansible_version.full is version("2.14", ">=")

  tasks:
    - name: Install Nginx dependencies
      package:
        name: "{{ item }}"
        state: present
      loop:
        - gcc
        - make
        - libssl-dev
      tags: [dependencies]

    - name: Create Nginx config from template
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        owner: root
        group: root
        mode: "0644"
        validate: "nginx -t -c %s"
      notify: Reload Nginx
      tags: [config]

    - name: Ensure Nginx is running
      service:
        name: nginx
        state: started
        enabled: true
      tags: [service]

  handlers:
    - name: Reload Nginx
      service:
        name: nginx
        state: reloaded

Jinja2模板与变量管理

Ansible使用Jinja2模板引擎生成配置文件。模板文件结合变量实现配置的参数化:

# templates/nginx.conf.j2
user {{ nginx_user | default("www-data") }};
worker_processes {{ nginx_worker_processes }};
worker_rlimit_nofile {{ nginx_max_connections | int * 2 }};

events {
    worker_connections {{ nginx_max_connections }};
    multi_accept on;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile      on;
    tcp_nopush    on;

    {% if nginx_gzip | default(true) %}
    gzip on;
    gzip_min_length 1024;
    gzip_types text/plain text/css application/json;
    {% endif %}

    upstream backend {
        {% for server in upstream_servers %}
        server {{ server }} max_fails=3 fail_timeout=30s;
        {% endfor %}
    }

    server {
        listen 80;
        server_name {{ server_name }};
        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

变量分层管理策略:

# group_vars/all.yml - 全局变量
app_name: myapp
deploy_user: deploy

# group_vars/webservers.yml - 组级变量
nginx_max_connections: 4096
enable_ssl: true

# host_vars/web01.example.com.yml - 主机级变量
nginx_worker_processes: 4
upstream_servers:
  - 10.0.1.10:8000
  - 10.0.1.11:8000

Role角色开发与复用

Role是Ansible的可复用单元,按照标准目录结构组织:

roles/nginx/
├── defaults/
│   └── main.yml          # 默认变量
├── vars/
│   └── main.yml          # 角色内部变量
├── tasks/
│   ├── main.yml          # 主任务入口
│   ├── install.yml       # 安装子任务
│   └── configure.yml     # 配置子任务
├── handlers/
│   └── main.yml          # 处理器
├── templates/
│   ├── nginx.conf.j2
│   └── vhost.conf.j2
├── files/
│   └── nginx.repo
└── meta/
    └── main.yml          # 角色依赖声明

Role的主任务文件组织:

# roles/nginx/tasks/main.yml
---
- name: Include OS-specific variables
  include_vars: "{{ ansible_os_family }}.yml"
  tags: [always]

- name: Install Nginx
  include_tasks: install.yml
  tags: [install]

- name: Configure Nginx
  include_tasks: configure.yml
  tags: [config]

- name: Manage Nginx service
  include_tasks: service.yml
  tags: [service]

高级技巧与实战模式

滚动更新与分批执行

- name: Rolling application update
  hosts: webservers
  serial: 1
  tasks:
    - name: Drain node from load balancer
      command: /usr/local/bin/drain-node {{ inventory_hostname }}
      delegate_to: lb01.example.com

    - name: Deploy new version
      shell: "/opt/app/bin/deploy {{ app_version }}"

    - name: Run health check
      uri:
        url: "http://{{ inventory_hostname }}:8000/health"
        status_code: 200
      retries: 5
      delay: 10

    - name: Enable node in load balancer
      command: /usr/local/bin/enable-node {{ inventory_hostname }}
      delegate_to: lb01.example.com

异步任务与并发控制

- name: Parallel package installation
  hosts: all
  tasks:
    - name: Install packages asynchronously
      package:
        name: "{{ item }}"
        state: present
      loop: "{{ large_package_list }}"
      async: 300
      poll: 0
      register: install_results

    - name: Wait for all installations
      async_status:
        jid: "{{ item.ansible_job_id }}"
      loop: "{{ install_results.results }}"
      register: job_results
      until: job_results.finished
      retries: 60
      delay: 5

Molecule自动化测试

Molecule是Ansible Role的测试框架,确保Playbook的可靠性与幂等性:

# molecule/default/molecule.yml
driver:
  name: docker
platforms:
  - name: ubuntu2204
    image: geerlingguy/docker-ubuntu2204-ansible
    privileged: true
  - name: centos9
    image: geerlingguy/docker-rockylinux9-ansible
    privileged: true
provisioner:
  name: ansible
  playbooks:
    converge: converge.yml
verifier:
  name: ansible

# molecule/default/verify.yml
- name: Verify Nginx installation
  hosts: all
  tasks:
    - name: Check Nginx is running
      command: systemctl is-active nginx
      changed_when: false

    - name: Check config syntax
      command: nginx -t
      changed_when: false

结语

Ansible以其无Agent架构、声明式配置和丰富的模块生态,成为基础设施自动化管理的首选工具。通过Inventory分层管理、Playbook任务编排、Role复用和Molecule测试,可以构建可靠、可维护、可扩展的自动化运维体系。在云原生时代,Ansible与Terraform互补——Terraform负责基础设施供给,Ansible负责配置管理与应用部署,两者结合形成完整的Infrastructure as Code解决方案。