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

Ansible架构与工作原理

Ansible是DevOps实践中广泛使用的自动化运维工具,采用无代理(agentless)架构,通过SSH协议管理目标主机,无需在远程节点安装客户端。Ansible的核心优势在于声明式配置:管理员描述期望的系统状态,Ansible负责将系统调整到该状态。在SRE稳定性工程中,Ansible用于批量部署、配置漂移修复和故障应急响应,大幅减少人工操作带来的不一致性。

Inventory主机清单配置

Inventory文件定义了Ansible管理的所有主机及其分组,支持INI和YAML两种格式。

# /etc/ansible/hosts - INI格式
[webservers]
web01 ansible_host=192.168.1.10 ansible_user=deploy
web02 ansible_host=192.168.1.11 ansible_user=deploy
web03 ansible_host=192.168.1.12 ansible_user=deploy

[dbservers]
db01 ansible_host=192.168.1.20 ansible_user=postgres

[prod:children]
webservers
dbservers

[prod:vars]
ansible_python_interpreter=/usr/bin/python3

通过组嵌套和组变量实现层次化管理。ansible_host指定实际IP,ansible_user指定SSH连接用户。生产环境建议使用SSH密钥认证而非密码。

Playbook基础与YAML语法

Playbook是Ansible的核心配置文件,使用YAML格式描述任务序列。每个task调用一个模块完成特定操作。

---
# deploy_web.yml - Web服务器批量部署
- name: Deploy Nginx web servers
  hosts: webservers
  become: yes
  vars:
    nginx_version: "1.25.3"
    worker_processes: auto

  tasks:
    - name: Install required packages
      apt:
        name:
          - nginx
          - python3-pip
          - unzip
        state: present
        update_cache: yes

    - name: Configure nginx
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        backup: yes
      notify: restart nginx

    - name: Ensure nginx is running and enabled
      service:
        name: nginx
        state: started
        enabled: yes

    - name: Open firewall ports
      ufw:
        rule: allow
        port: "{{ item }}"
        proto: tcp
      loop:
        - 80
        - 443

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

become: yes表示以sudo权限执行任务。notify仅在task状态为changed时触发handler,避免不必要的重启。backup: yes在修改文件前自动备份原文件。

常用模块详解与实战

Ansible提供数百个内置模块,日常运维中最常用的包括:

# copy模块:复制文件到远程主机
- name: Copy config file
  copy:
    src: files/app.conf
    dest: /etc/app/app.conf
    owner: deploy
    group: deploy
    mode: '0644'

# file模块:管理文件和目录
- name: Create application directory
  file:
    path: /opt/app/logs
    state: directory
    recurse: yes
    owner: deploy
    mode: '0755'

# git模块:拉取代码仓库
- name: Deploy application code
  git:
    repo: https://github.com/example/app.git
    dest: /opt/app/current
    version: release-v2.1
    force: yes

# command/shell模块:执行命令
- name: Run database migration
  command: /opt/app/current/bin/migrate.sh
  args:
    chdir: /opt/app/current
  register: migrate_result

- name: Show migration output
  debug:
    var: migrate_result.stdout

# stat模块:检查文件状态
- name: Check if config exists
  stat:
    path: /etc/app/app.conf
  register: config_file

- name: Create config if missing
  copy:
    src: files/default.conf
    dest: /etc/app/app.conf
  when: not config_file.stat.exists

register关键字将模块执行结果保存到变量中,后续task可通过when条件判断决定是否执行,实现条件式配置。

Roles角色化组织与复用

当Playbook规模增大时,使用Roles将任务、变量、模板、文件按功能模块拆分,提升可维护性和复用性。Docker自动化部署场景中可将容器安装、镜像管理、服务编排封装为独立Role。

# Role目录结构
roles/
  nginx/
    tasks/main.yml       # 主任务文件
    handlers/main.yml    # 触发器
    templates/nginx.conf.j2  # Jinja2模板
    vars/main.yml        # Role变量
    defaults/main.yml    # 默认变量
    files/               # 静态文件
    meta/main.yml        # Role元数据依赖

# 调用Role的Playbook
- name: Configure all servers
  hosts: all
  become: yes
  roles:
    - role: nginx
      vars:
        nginx_worker_connections: 1024
    - role: docker
      when: "'container_hosts' in group_names"

变量管理与条件渲染

Ansible变量支持多层级覆盖,优先级从高到低为:命令行-e参数 > Playbook vars > Inventory组变量 > Role defaults。Jinja2模板引擎实现动态配置文件渲染。

{# nginx.conf.j2 - Jinja2模板 #}
worker_processes {{ worker_processes | default('auto') }};
worker_connections {{ nginx_worker_connections | default(1024) }};

{% if nginx_enable_https is defined and nginx_enable_https %}
http {
    server {
        listen 80;
        server_name {{ nginx_server_name }};
        return 301 https://$host$request_uri;
    }
    server {
        listen 443 ssl;
        server_name {{ nginx_server_name }};
        ssl_certificate {{ nginx_ssl_cert }};
        ssl_certificate_key {{ nginx_ssl_key }};
        location / {
            proxy_pass http://{{ nginx_upstream }};
            proxy_set_header Host $host;
        }
    }
}
{% else %}
http {
    server {
        listen 80;
        server_name {{ nginx_server_name }};
        location / {
            proxy_pass http://{{ nginx_upstream }};
        }
    }
}
{% endif %}

不同环境(开发、测试、生产)通过覆盖变量实现差异化配置,同一套Role代码无需修改即可部署到不同环境。配合ansible-vault加密敏感变量(如数据库密码、SSL私钥),满足安全合规要求。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/ansible-zi-dong-hua-yun-wei-shi-zhan-playbook-bian-xie-yu/

赞 (0)
小编小编
上一篇 2026年9月8日
下一篇 2026年9月8日

相关推荐

Ansible自动化运维实战:Playbook编写与批量部署配置管理

Ansible架构与无Agent设计原理

Ansible采用无Agent架构,通过SSH协议管理远程主机,不需要在被管理节点上安装任何客户端程序。控制节点通过SSH连接目标主机,将模块代码传输到远程执行,执行完成后自动清理。这种设计降低了部署复杂度,也减少了安全攻击面。

Ansible的核心组件包括Inventory(主机清单)、Modules(模块)、Playbook(剧本)、Roles(角色)。Inventory定义被管理主机的分组和连接信息,Modules封装具体的操作逻辑,Playbook以YAML格式编排任务序列,Roles将Playbook拆分为可复用的目录结构。

安装Ansible只需在控制节点执行:

# Ubuntu/Debian
sudo apt update && sudo apt install -y ansible

# CentOS/RHEL
sudo yum install -y epel-release && sudo yum install -y ansible

# pip安装
pip install ansible

# 验证安装
ansible --version

Inventory主机清单配置

Inventory文件定义被管理主机的分组、连接方式、认证信息。支持INI和YAML两种格式,以下是一个典型的多环境Inventory配置。

# /etc/ansible/hosts
[web_servers]
web1 ansible_host=192.168.1.10 ansible_user=deploy ansible_port=22
web2 ansible_host=192.168.1.11 ansible_user=deploy ansible_port=22

[db_servers]
db1 ansible_host=192.168.1.20 ansible_user=postgres

[cache_servers]
cache1 ansible_host=192.168.1.30 ansible_user=redis

# 组嵌套
[production:children]
web_servers
db_servers
cache_servers

# 组变量
[production:vars]
ansible_python_interpreter=/usr/bin/python3
deploy_dir=/opt/app
nginx_version=1.25.3

对于主机数量较多的场景,可以使用动态Inventory。动态Inventory脚本从CMDB、云平台API或Consul等服务发现工具获取主机列表,实现自动更新。

# 从AWS获取动态Inventory
# ansible.cfg
[defaults]
inventory = ./aws_ec2.yaml

# aws_ec2.yaml
plugin: aws_ec2
regions:
  - us-east-1
  - ap-northeast-1
keyed_groups:
  - key: tags.Environment
    prefix: env_
  - key: tags.Role
    prefix: role_
filters:
  tag:Environment: production

Playbook编写与任务编排

Playbook是Ansible的核心,以YAML格式描述配置管理和部署流程。以下是一个完整的Nginx部署Playbook,包含安装、配置、服务管理和健康检查。

---
- name: 部署Nginx Web服务器
  hosts: web_servers
  become: yes
  vars:
    nginx_workers: auto
    nginx_port: 80
    nginx_root: /var/www/html

  tasks:
    - name: 安装Nginx
      package:
        name: nginx
        state: present
      notify: restart nginx

    - name: 创建网站目录
      file:
        path: "{{ nginx_root }}"
        state: directory
        owner: www-data
        group: www-data
        mode: '0755'

    - name: 配置Nginx
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        validate: nginx -t -c %s
      notify: restart nginx

    - name: 部署站点配置
      template:
        src: site.conf.j2
        dest: /etc/nginx/conf.d/default.conf
      notify: restart nginx

    - name: 启动并设置开机自启
      systemd:
        name: nginx
        state: started
        enabled: yes

    - name: 等待Nginx就绪
      wait_for:
        port: "{{ nginx_port }}"
        timeout: 10

    - name: 健康检查
      uri:
        url: "http://{{ ansible_host }}:{{ nginx_port }}/health"
        status_code: 200
      retries: 3
      delay: 2

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

notify和handlers机制实现了配置变更后的按需重启。只有当template任务检测到文件内容变化时才会触发restart nginx handler,避免不必要的重启操作。

Roles角色化拆分与复用

当Playbook膨胀到数百行时,使用Roles将任务、变量、模板、文件按功能模块拆分。Ansible Galaxy上有大量社区维护的Roles可以直接使用。

# 目录结构
roles/
  nginx/
    tasks/main.yml
    handlers/main.yml
    templates/nginx.conf.j2
    templates/site.conf.j2
    vars/main.yml
    defaults/main.yml
    meta/main.yml

# 使用Role的Playbook
---
- name: 部署Web集群
  hosts: web_servers
  become: yes
  roles:
    - role: nginx
      vars:
        nginx_workers: 4
    - role: geerlingguy.certbot
      vars:
        certbot_certs:
          - domains: ["www.example.com"]

批量部署中的错误处理与回滚

生产环境部署需要考虑失败回滚。Ansible通过block/rescue机制实现try-catch逻辑,配合serial参数控制滚动更新批次。

---
- name: 滚动更新Web服务
  hosts: web_servers
  become: yes
  serial: 2  # 每次更新2台
  max_fail_percentage: 0  # 任何失败都停止

  tasks:
    - block:
        - name: 备份当前版本
          shell: "cp -r /opt/app /opt/app.bak.{{ ansible_date_time.epoch }}"
        
        - name: 拉取新版本代码
          git:
            repo: https://github.com/example/app.git
            dest: /opt/app
            version: "{{ app_version }}"
        
        - name: 安装依赖
          shell: "cd /opt/app && npm install --production"
        
        - name: 重启应用
          systemd:
            name: app
            state: restarted
        
        - name: 验证服务
          uri:
            url: "http://{{ ansible_host }}:3000/health"
            status_code: 200
          retries: 5
          delay: 3
      
      rescue:
        - name: 回滚到备份版本
          shell: "rm -rf /opt/app && mv /opt/app.bak.{{ ansible_date_time.epoch }} /opt/app"
        
        - name: 重启应用(回滚后)
          systemd:
            name: app
            state: restarted
        
        - name: 标记主机失败
          fail:
            msg: "部署失败,已回滚到上一个版本"
      
      always:
        - name: 清理旧备份
          shell: "find /opt -name 'app.bak.*' -mtime +7 -exec rm -rf {} +"
          ignore_errors: yes

serial参数将主机分批处理,每次只更新2台服务器,配合max_fail_percentage: 0确保任何一台失败都停止后续部署。rescue块中执行回滚操作,将应用恢复到部署前的状态。always块清理超过7天的旧备份,保持磁盘整洁。

Ansible Vault加密敏感信息

Playbook中可能包含数据库密码、API密钥等敏感信息,使用Ansible Vault对变量文件加密。

# 创建加密变量文件
ansible-vault create group_vars/production/vault.yml
# 输入vault密码后编辑内容:
# db_password: S3cr3tP@ss
# api_key: ak-xxxxxxxxxxxx

# 编辑已加密文件
ansible-vault edit group_vars/production/vault.yml

# 执行Playbook时指定密码
ansible-playbook deploy.yml --ask-vault-pass

# 或使用密码文件
echo "myvaultpass" > .vault_pass
ansible-playbook deploy.yml --vault-password-file .vault_pass

Ansible自动化运维的实践要点在于逐步推进:先从简单的Ad-hoc命令开始验证连通性,再编写Playbook处理重复性任务,最后通过Roles实现跨项目复用。对于大规模集群,结合AWX或Ansible Semaphore等Web管理平台可以实现审批流程、执行日志和权限管理。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/ansible-zi-dong-hua-yun-wei-shi-zhan-playbook-bian-xie-yu/

赞 (0)
小编小编
上一篇 2026年9月4日
下一篇 2026年9月4日

相关推荐

Ansible自动化运维实战:Playbook编写与批量主机配置管理

Ansible是基于SSH的自动化运维工具,无需在目标主机安装Agent,通过Playbook以YAML声明式语法描述配置任务,实现批量主机管理和应用部署。相比Shell脚本的手工编排,Ansible的幂等性设计保证重复执行不会产生副作用,适合CI/CD流水线集成和基础设施标准化管理。

Inventory主机清单与分组管理

Ansible通过Inventory文件管理目标主机,支持INI和YAML两种格式。一个典型的生产环境Inventory:

# /etc/ansible/hosts
[webservers]
web-01 ansible_host=10.0.1.11 ansible_user=deploy
web-02 ansible_host=10.0.1.12 ansible_user=deploy
web-03 ansible_host=10.0.1.13 ansible_user=deploy

[dbservers]
db-01 ansible_host=10.0.2.11 ansible_user=postgres

[prod:children]
webservers
dbservers

[prod:vars]
ansible_python_interpreter=/usr/bin/python3
ansible_ssh_private_key_file=~/.ssh/id_ed25519

通过分组继承(children)可将web和db服务器归入prod组统一管理。组变量(vars)对该组所有主机生效,避免逐主机重复定义。动态Inventory可对接云平台API,自动获取EC2或OpenStack实例列表。

Playbook结构与任务编写

Playbook是Ansible的核心,由一个或多个Play组成,每个Play指定目标主机和任务列表。以下是一个完整的Nginx部署Playbook:

---
- name: Deploy Nginx web server
  hosts: webservers
  become: yes
  vars:
    nginx_version: "1.25.3"
    nginx_workers: auto
    nginx_max_connections: 10240

  tasks:
    - name: Install Nginx
      yum:
        name: "nginx-{{ nginx_version }}"
        state: present
      notify: restart nginx

    - name: Configure nginx.conf
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        backup: yes
        validate: nginx -t -c %s
      notify: reload nginx

    - name: Ensure Nginx is running and enabled
      systemd:
        name: nginx
        state: started
        enabled: yes

    - name: Open firewall ports
      firewalld:
        port: 80/tcp
        permanent: yes
        state: enabled
        immediate: yes

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

    - name: reload nginx
      systemd:
        name: nginx
        state: reloaded

notify触发handler执行,但仅在task状态为changed时触发。handler在所有task执行完毕后统一运行,且同名handler只执行一次。配置文件验证(validate)在写入后自动检查语法,避免推送错误配置导致服务中断。

Jinja2模板与变量管理

Ansible使用Jinja2模板引擎生成配置文件。上面的nginx.conf.j2模板:

worker_processes {{ nginx_workers }};
worker_connections {{ nginx_max_connections }};

http {
    upstream backend {
        {% for host in groups['webservers'] %}
        server {{ hostvars[host]['ansible_host'] }}:8080 weight=1;
        {% endfor %}
    }

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

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

模板中可直接访问Ansible的Facts(如ansible_hostname)和主机变量(如hostvars)。通过循环动态生成upstream列表,新增web服务器只需更新Inventory,无需手动修改配置文件。

变量优先级从低到高:Inventory组变量 -> Inventory主机变量 -> Playbook中vars -> 命令行--extra-vars。生产环境建议使用group_vars/和host_vars/目录管理变量,按层级覆盖:

project/
├── group_vars/
│   ├── webservers.yml      # web组变量
│   └── all.yml             # 全局变量
├── host_vars/
│   └── web-01.yml          # web-01特有变量
└── site.yml

Role模块化与复用

当Playbook膨胀到数百行时,Role将任务、模板、变量按功能拆分为标准目录结构,实现复用和共享。使用ansible-galaxy init创建Role骨架:

ansible-galaxy init roles/nginx

# 生成的目录结构
roles/nginx/
├── tasks/main.yml       # 主任务
├── handlers/main.yml    # 处理器
├── templates/           # Jinja2模板
├── vars/main.yml        # Role变量
├── defaults/main.yml    # 默认变量
└── meta/main.yml        # 依赖声明

Playbook中引用Role:

---
- name: Configure web servers
  hosts: webservers
  become: yes
  roles:
    - role: nginx
      vars:
        nginx_version: "1.25.3"
    - role: monitoring
      when: enable_monitoring | default(true)

Ansible Galaxy提供了大量社区Role,可直接复用:

ansible-galaxy install geerlingguy.nginx -p roles/

条件判断与循环控制

条件判断使用when子句,基于Facts或注册变量决定是否执行任务:

- name: Install EPEL on CentOS only
  yum:
    name: epel-release
    state: present
  when: ansible_os_family == "RedHat" and ansible_distribution_major_version | int >= 8

- name: Restart service if config changed
  systemd:
    name: "{{ item }}"
    state: restarted
  loop:
    - nginx
    - php-fpm
  when: config_updated.changed

注册变量(register)捕获task执行结果,可用于后续条件判断。changed属性表示task是否实际修改了系统状态。

循环(loop)替代了旧版的with_items语法,支持更灵活的迭代:

- name: Create multiple users
  user:
    name: "{{ item.name }}"
    groups: "{{ item.groups }}"
    shell: "{{ item.shell | default('/bin/bash') }}"
  loop:
    - { name: 'deploy', groups: 'wheel' }
    - { name: 'app', groups: 'nginx', shell: '/sbin/nologin' }

异步任务与POLL机制

长时间运行的任务(如大文件下载、编译安装)会阻塞Ansible执行。异步模式允许任务在后台运行,Ansible轮询状态:

- name: Download large dataset
  get_url:
    url: https://example.com/dataset.tar.gz
    dest: /data/dataset.tar.gz
  async: 3600
  poll: 15
  register: download_result

- name: Wait for download if still running
  async_status:
    jid: "{{ download_result.ansible_job_id }}"
  register: job_result
  until: job_result.finished
  retries: 240
  delay: 15

async设置超时时间(秒),poll设置轮询间隔。设为0时fire-and-forget,不等待结果继续执行后续任务。

Ansible Vault加密敏感数据

数据库密码、API密钥等敏感信息不应明文存储在Playbook中。Ansible Vault对变量文件进行AES加密:

# 加密变量文件
ansible-vault encrypt group_vars/prod/vault.yml

# 编辑加密文件
ansible-vault edit group_vars/prod/vault.yml

# 执行时提供密码
ansible-playbook site.yml --ask-vault-pass
# 或使用密码文件
ansible-playbook site.yml --vault-password-file ~/.vault_pass

CI/CD环境中通常将Vault密码存储在CI变量的环境变量中,实现自动化部署流程的安全集成。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/ansible-zi-dong-hua-yun-wei-shi-zhan-playbook-bian-xie-yu/

赞 (0)
小编小编
上一篇 2026年8月24日
下一篇 2026年8月24日

相关推荐

Ansible自动化运维实战:Playbook编写与批量主机管理配置

Ansible是基于SSH协议的无Agent自动化运维工具,通过YAML格式的Playbook描述配置任务,实现批量主机管理、应用部署和滚动更新。相比Puppet和Chef,Ansible无需在目标主机安装客户端,部署门槛低,是Linux系统管理和服务器运维场景中广泛使用的配置管理工具。

Ansible架构与Inventory主机清单配置

Ansible的核心组件包括Inventory(主机清单)、Playbook(任务剧本)、Module(功能模块)和Role(角色复用)。控制节点通过SSH连接目标主机,将模块代码推送至远程执行后删除,整个过程无驻留进程。

Inventory文件定义被管理主机的分组和连接参数。以下是一个生产环境的Inventory配置示例:

# /etc/ansible/hosts
[webservers]
web01 ansible_host=192.168.1.10 ansible_user=deploy ansible_port=22
web02 ansible_host=192.168.1.11 ansible_user=deploy ansible_port=22
web03 ansible_host=192.168.1.12 ansible_user=deploy ansible_port=22

[dbservers]
db01 ansible_host=192.168.1.20 ansible_user=postgres ansible_port=2222

[loadbalancers]
lb01 ansible_host=192.168.1.1 ansible_user=admin

[webservers:vars]
ansible_python_interpreter=/usr/bin/python3
nginx_version=1.25.3

[production:children]
webservers
dbservers
loadbalancers

[production:vars]
env=prod
datacenter=dc1

使用SSH密钥认证时,通过ansible_ssh_private_key_file指定密钥路径。如果主机较多,也可以使用动态Inventory脚本从云平台API(如AWS、阿里云)动态获取主机列表。

Playbook编写与核心模块使用

Playbook是Ansible的核心,以YAML描述任务序列。以下是一个完整的Nginx部署Playbook,涵盖软件安装、配置文件分发、服务管理和健康检查:

---
- name: Deploy Nginx web server cluster
  hosts: webservers
  become: yes
  vars:
    nginx_worker_processes: auto
    nginx_worker_connections: 10240
    upstream_servers:
      - { name: "backend1", ip: "192.168.1.20", port: 8080 }
      - { name: "backend2", ip: "192.168.1.21", port: 8080 }

  tasks:
    - name: Install Nginx package
      apt:
        name: "nginx={{ nginx_version }}"
        state: present
        update_cache: yes

    - name: Create nginx config directory
      file:
        path: /etc/nginx/conf.d
        state: directory
        owner: root
        group: root
        mode: '0755'

    - name: Deploy nginx.conf from template
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        owner: root
        group: root
        mode: '0644'
        validate: 'nginx -t -c %s'
      notify: reload nginx

    - name: Deploy upstream config
      template:
        src: upstream.conf.j2
        dest: /etc/nginx/conf.d/upstream.conf
      notify: reload nginx

    - name: Ensure Nginx is running and enabled
      systemd:
        name: nginx
        state: started
        enabled: yes
        daemon_reload: yes

    - name: Wait for Nginx to be ready
      wait_for:
        port: 80
        timeout: 10

    - name: Health check
      uri:
        url: "http://{{ inventory_hostname }}/"
        status_code: 200
      retries: 3
      delay: 2

  handlers:
    - name: reload nginx
      systemd:
        name: nginx
        state: reloaded

其中template模块使用Jinja2模板引擎,nginx.conf.j2中的变量引用示例如下:

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

events {
    worker_connections {{ nginx_worker_connections }};
}

http {
    upstream backend {
        {% for server in upstream_servers %}
        server {{ server.ip }}:{{ server.port }} weight=3 max_fails=3 fail_timeout=30s;
        {% endfor %}
    }

    server {
        listen 80;
        server_name _;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_connect_timeout 5s;
            proxy_read_timeout 30s;
        }
    }
}

Roles角色复用与目录结构规范

当Playbook规模增长时,使用Role将任务、变量、模板、文件按功能模块化组织。Ansible Galaxy社区提供了大量现成Role。标准的Role目录结构如下:

roles/
└── nginx/
    ├── tasks/
    │   ├── main.yml
    │   ├── install.yml
    │   └── configure.yml
    ├── handlers/
    │   └── main.yml
    ├── templates/
    │   ├── nginx.conf.j2
    │   └── upstream.conf.j2
    ├── vars/
    │   └── main.yml
    ├── defaults/
    │   └── main.yml
    ├── files/
    │   └── index.html
    └── meta/
        └── main.yml

在Playbook中引用Role:

---
- name: Full stack deployment
  hosts: production
  become: yes
  roles:
    - role: nginx
      vars:
        nginx_worker_connections: 20480
    - role: mysql
      when: "'dbservers' in group_names"
    - role: monitoring
      tags: [monitoring, always]

批量滚动更新与错误处理策略

生产环境中滚动更新(Rolling Update)是避免服务中断的关键。通过serial参数控制每次操作的主机比例,结合失败阈值实现灰度发布:

---
- name: Rolling update application
  hosts: webservers
  become: yes
  serial: "30%"
  max_fail_percentage: 20

  tasks:
    - name: Drain node from load balancer
      command: /usr/local/bin/lb_drain.sh {{ inventory_hostname }}

    - name: Pull latest image
      command: docker pull app:{{ version }}

    - name: Restart container
      systemd:
        name: app
        state: restarted

    - name: Wait for app health
      uri:
        url: "http://{{ inventory_hostname }}:8080/health"
        status_code: 200
      retries: 5
      delay: 3

    - name: Add node back to load balancer
      command: /usr/local/bin/lb_add.sh {{ inventory_hostname }}

Ansible的幂等性(Idempotency)设计保证了重复执行Playbook不会产生副作用——每个模块在执行前会检查目标状态是否已达预期,仅在需要变更时才执行操作。这一特性使得Ansible非常适合用于持续配置管理和服务器的安全加固场景。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/ansible-zi-dong-hua-yun-wei-shi-zhan-playbook-bian-xie-yu/

赞 (0)
小编小编
上一篇 2026年8月21日
下一篇 2026年8月21日

相关推荐