插件窝 干货文章 Ansible Playbook 讲解与实战操作

Ansible Playbook 讲解与实战操作

name Playbook Nginx Ansible 144    来源:    2025-04-20

Ansible Playbook 讲解与实战操作

1. Playbook 基础概念

Ansible Playbook 是用 YAML 格式编写的自动化脚本,用于定义配置、部署和编排任务。与临时命令相比,Playbook 更加结构化、可重复且功能强大。

1.1 Playbook 结构

一个基本的 Playbook 包含以下元素:

---
- name: 描述性名称
  hosts: 目标主机或组
  vars:
    变量定义
  tasks:
    - 任务1
    - 任务2
  handlers:
    - 处理器1
    - 处理器2

1.2 YAML 语法要点

  • 使用 --- 开始文档
  • 缩进使用空格(通常2个空格)
  • 键值对使用 key: value 格式
  • 列表项以 - 开头
  • # 表示注释

2. Playbook 核心组件

2.1 主机与用户

- hosts: webservers  # 目标主机组
  remote_user: root   # 远程执行用户
  become: yes         # 是否提权
  become_method: sudo # 提权方式
  become_user: postgres # 提权为特定用户

2.2 变量定义

vars:
  http_port: 80
  max_clients: 200
  remote_install_path: "/opt/apps"

vars_files:
  - vars/common.yml
  - vars/secrets.yml

2.3 任务(Tasks)

任务列表是 Playbook 的核心部分:

tasks:
  - name: 确保Nginx已安装
    apt:
      name: nginx
      state: present
    when: ansible_os_family == "Debian"

  - name: 复制配置文件
    copy:
      src: files/nginx.conf
      dest: /etc/nginx/nginx.conf
    notify: restart nginx

2.4 处理器(Handlers)

处理器用于响应任务的通知:

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

3. 实战操作示例

3.1 基础示例:部署Nginx

---
- name: 安装并配置Nginx
  hosts: webservers
  become: yes

  vars:
    nginx_port: 8080
    nginx_root: /var/www/html

  tasks:
    - name: 安装Nginx
      apt:
        name: nginx
        state: latest
        update_cache: yes
      when: ansible_os_family == "Debian"

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

    - name: 配置Nginx
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify: restart nginx

    - name: 确保Nginx已启动
      service:
        name: nginx
        state: started
        enabled: yes

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

3.2 进阶示例:多角色部署

---
- name: 部署Web应用
  hosts: all
  become: yes

  vars:
    db_user: app_user
    db_password: "{{ vault_db_password }}"

  tasks:
    - name: 包含基础系统配置
      include_role:
        name: common

    - name: 部署数据库
      include_role:
        name: database
      when: "'db' in group_names"

    - name: 部署Web服务器
      include_role:
        name: web
      when: "'web' in group_names"

    - name: 部署负载均衡器
      include_role:
        name: loadbalancer
      when: "'lb' in group_names"

3.3 使用模板(Jinja2)

创建模板文件 templates/nginx.conf.j2:

server {
    listen {{ nginx_port }};
    server_name {{ server_name | default('localhost') }};

    root {{ nginx_root }};

    location / {
        try_files $uri $uri/ =404;
    }

    {% if enable_php %}
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }
    {% endif %}
}

4. 高级技巧

4.1 条件执行

tasks:
  - name: 仅在主节点执行
    command: /usr/bin/master_command
    when: inventory_hostname == groups['master'][0]

  - name: 检查文件是否存在
    stat:
      path: /etc/some_file
    register: file_stat

  - name: 文件存在时才执行
    command: /bin/process_file
    when: file_stat.stat.exists

4.2 循环

tasks:
  - name: 添加多个用户
    user:
      name: "{{ item }}"
      state: present
      groups: "wheel"
    loop:
      - alice
      - bob
      - charlie

4.3 错误处理

tasks:
  - name: 尝试危险操作
    command: /bin/dangerous_command
    ignore_errors: yes
    register: cmd_result

  - name: 检查是否成功
    debug:
      msg: "命令执行失败"
    when: cmd_result is failed

5. 最佳实践

  1. 目录结构组织:

    playbooks/
    ├── site.yml
    ├── roles/
    │   ├── common/
    │   ├── web/
    │   └── db/
    ├── group_vars/
    ├── host_vars/
    ├── files/
    └── templates/
    
  2. 使用角色(Roles) 将相关任务、处理程序、文件和模板组织在一起

  3. 变量优先级:

    • 命令行变量 (-e)
    • Playbook 变量 (vars:)
    • 主机变量 (host_vars/)
    • 组变量 (group_vars/)
    • Inventory 变量
    • 角色默认变量 (roles/x/defaults/main.yml)
  4. 使用标签(Tags) 选择性执行任务:

    tasks:
     - name: 安装软件
       yum:
         name: "{{ item }}"
         state: present
       loop: "{{ packages }}"
       tags:
         - packages
    
  5. 使用Vault加密敏感数据:

    ansible-vault create secrets.yml
    ansible-playbook --ask-vault-pass site.yml
    

6. 调试与测试

  1. 语法检查:

    ansible-playbook --syntax-check playbook.yml
    
  2. 试运行:

    ansible-playbook --check playbook.yml
    
  3. 详细输出:

    ansible-playbook -v playbook.yml
    
  4. 逐步执行:

    ansible-playbook --step playbook.yml
    
  5. 限制执行主机:

    ansible-playbook --limit webserver1 playbook.yml
    

通过以上内容,您应该能够开始编写和使用 Ansible Playbook 来自动化您的 IT 基础设施管理任务。随着实践经验的积累,您可以探索更高级的功能,如动态 Inventory、自定义模块和插件等。