Ansible自动化运维实战:批量服务器配置管理与Playbook编写

Ansible是服务器运维中广泛使用的自动化配置管理工具,基于SSH协议无需在目标主机安装Agent,通过YAML语法的Playbook描述系统配置状态,适合批量服务器初始化、应用部署和配置变更。本文从安装配置到Playbook编写给出完整实践方案。

Ansible架构与工作原理

Ansible采用无Agent架构,控制节点通过SSH连接被管理主机,执行模块化任务。核心组件包括:Inventory(主机清单)、Module(执行模块)、Playbook(任务编排)、Role(角色复用)。与Puppet、Chef等工具相比,Ansible的”推送”模式不依赖目标主机常驻进程,降低了部署复杂度。

Ansible的工作流程是:读取Inventory获取目标主机 → 加载Playbook解析任务 → 通过SSH连接目标主机执行对应模块 → 收集执行结果并输出。

安装Ansible与Inventory配置

控制节点安装Ansible,推荐使用pip方式以保证版本可控:

# 安装Ansible
pip install ansible-core==2.16.0

# 验证安装
ansible --version

# 配置SSH免密登录到目标主机
ssh-keygen -t ed25519
ssh-copy-id root@192.168.1.101
ssh-copy-id root@192.168.1.102

Inventory文件定义被管理主机分组,支持按功能、环境、机房等维度组织:

# /etc/ansible/hosts
[web_servers]
web01 ansible_host=192.168.1.101 ansible_user=root
web02 ansible_host=192.168.1.102 ansible_user=root

[db_servers]
db01 ansible_host=192.168.1.201 ansible_user=postgres

[prod:children]
web_servers
db_servers

[web_servers:vars]
nginx_version=1.25.3
max_connections=1024

使用ansible_host指定实际IP,ansible_user指定SSH用户。组变量通过:vars后缀定义,子组通过:children继承父组配置。

Ad-hoc命令与常用模块

Ad-hoc命令适合一次性操作,无需编写Playbook。常用模块包括yum/apt(包管理)、copy(文件传输)、template(模板渲染)、service(服务管理)、user(用户管理)。

# 检查所有主机连通性
ansible all -m ping

# 批量安装Nginx
ansible web_servers -m yum -a "name=nginx state=present"

# 批量启动Nginx并设置开机自启
ansible web_servers -m service -a "name=nginx state=started enabled=yes"

# 批量创建用户
ansible all -m user -a "name=deploy shell=/bin/bash groups=wheel"

# 拷贝配置文件并备份原文件
ansible web_servers -m copy -a "src=/local/nginx.conf dest=/etc/nginx/nginx.conf backup=yes"

# 执行Shell命令查看磁盘使用
ansible all -m shell -a "df -h | grep -v tmpfs"

Playbook任务编排与变量管理

Playbook是Ansible的核心,以YAML格式描述任务序列。以下是一个Web服务器初始化的完整Playbook:

# web_init.yml
---
- name: Web服务器初始化配置
  hosts: web_servers
  become: yes
  vars:
    nginx_worker_processes: auto
    nginx_worker_connections: 10240

  tasks:
    - name: 安装EPEL仓库
      yum:
        name: epel-release
        state: present

    - name: 安装Nginx
      yum:
        name: nginx
        state: latest

    - name: 渲染Nginx配置文件
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        backup: yes
      notify: restart nginx

    - name: 创建网站根目录
      file:
        path: /var/www/html
        state: directory
        owner: nginx
        group: nginx
        mode: '0755'

    - name: 部署默认页面
      copy:
        content: "{{ ansible_hostname }} - Service Online\n"
        dest: /var/www/html/index.html

    - name: 启动Nginx并设开机自启
      service:
        name: nginx
        state: started
        enabled: yes

  handlers:
    - name: restart nginx
      service:
        name: nginx
        state: restarted

notify和handlers实现配置变更后自动重启服务。template模块使用Jinja2模板渲染配置文件,变量在运行时动态替换。ansible_hostname是Ansible内置的Fact变量,运行时自动采集。

Nginx配置模板Jinja2语法

模板文件nginx.conf.j2中通过Jinja2语法引用变量:

# nginx.conf.j2
worker_processes {{ nginx_worker_processes }};

events {
    worker_connections {{ nginx_worker_connections }};
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    {% for server in web_servers %}
    upstream {{ server.name }} {
        server {{ server.ip }}:{{ server.port }};
    }
    {% endfor %}

    server {
        listen 80;
        server_name {{ ansible_hostname }};

        location / {
            proxy_pass http://{{ web_servers[0].name }};
        }
    }
}

{% for %}循环语法用于批量生成upstream配置,配合变量列表实现动态配置渲染。

Roles角色复用与目录结构

当Playbook规模增长,用Roles将任务按功能模块拆分,提高复用性。Role的标准目录结构:

roles/
└── nginx/
    ├── tasks/
    │   └── main.yml       # 主任务
    ├── handlers/
    │   └── main.yml       # 处理器
    ├── templates/
    │   └── nginx.conf.j2  # 模板文件
    ├── vars/
    │   └── main.yml       # 角色变量
    ├── defaults/
    │   └── main.yml       # 默认变量
    └── meta/
        └── main.yml       # 角色元数据

在Playbook中引用Role:

- name: 部署Web集群
  hosts: web_servers
  become: yes
  roles:
    - role: nginx
      vars:
        nginx_worker_connections: 20480
    - role: firewall
    - role: monitoring

变量优先级从低到高为:defaults/main.yml → inventory组变量 → Playbook中vars → Role调用时传入的vars。通过分层变量管理,同一Role可以适配不同环境的配置需求。

Ansible Vault加密敏感信息

数据库密码、API密钥等敏感信息不应明文存放在Playbook中。Ansible Vault提供加密功能:

# 创建加密变量文件
ansible-vault create secrets.yml
# 输入Vault密码后编辑文件内容
# db_password: "S3cr3tP@ss"

# 在Playbook中引用加密文件
- name: 数据库配置
  hosts: db_servers
  vars_files:
    - secrets.yml
  tasks:
    - name: 配置数据库
      template:
        src: postgresql.conf.j2
        dest: /etc/postgresql/postgresql.conf
      vars:
        db_password: "{{ db_password }}"

# 执行Playbook时提供Vault密码
ansible-playbook db_init.yml --ask-vault-pass

Ansible的批量配置管理能力在服务器规模超过10台时价值凸显。配合CI/CD流水线,可以实现配置变更的自动化审计和回滚,是运维标准化的重要基础设施。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/ansible-zi-dong-hua-yun-wei-shi-zhan-pi-liang-fu-wu-qi-pei/

(0)
小编小编
上一篇 5小时前
下一篇 5小时前

相关推荐