Ansible Playbook编写详细教程

1. Ansible Playbook简介

Ansible Playbook是自动化任务的核心组件,使用YAML格式编写,用于定义配置管理、应用部署、任务编排等操作。Playbook通过模块化的方式描述系统状态和任务执行顺序,具有幂等性(多次执行结果一致)的特点。

2. Playbook基础结构

Playbook的基本组成

Hosts: 定义目标主机组

Tasks: 要执行的具体任务列表

Variables: 自定义变量(可选)

Handlers: 任务触发器(可选)

示例基础结构

---
- name: Playbook名称
  hosts: 目标主机组
  vars:
    variable_name: value
  tasks:
    - name: 任务描述
      module_name:
        parameter1: value1
        parameter2: value2
  handlers:
    - name: 处理器名称
      module_name:
        parameter: value

3. 编写第一个Playbook

创建inventory文件

# inventory.ini
[webservers]
192.168.1.10
192.168.1.11

[database]
192.168.1.20

编写基础Playbook

---
- name: 配置Nginx服务器
  hosts: webservers
  become: yes

  tasks:
    - name: 安装Nginx
      apt:
        name: nginx
        state: present
        update_cache: yes

    - name: 启动Nginx服务
      service:
        name: nginx
        state: started
        enabled: yes

执行命令

ansible-playbook -i inventory.ini nginx_setup.yml

4. 使用变量

定义变量方式

在Playbook中直接定义

在单独的变量文件中定义

通过命令行传递变量

变量文件示例

# vars/nginx_vars.yml
nginx_port: 8080
nginx_root: "/var/www/html"

使用变量

---
- name: 配置Nginx
  hosts: webservers
  vars_files:
    - vars/nginx_vars.yml

  tasks:
    - name: 配置Nginx端口
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify: 重启Nginx

  handlers:
    - name: 重启Nginx
      service:
        name: nginx
        state: restarted

5. 条件判断与循环

条件判断示例

tasks:
  - name: 安装Apache (仅限Ubuntu)
    apt:
      name: apache2
      state: present
    when: ansible_distribution == "Ubuntu"

循环示例

tasks:
  - name: 创建多个用户
    user:
      name: "{{ item }}"
      state: present
    loop:
      - user1
      - user2
      - user3

复杂循环

tasks:
  - name: 安装多个包
    apt:
      name: "{{ item.name }}"
      state: "{{ item.state }}"
    loop:
      - { name: 'nginx', state: 'present' }
      - { name: 'mysql-server', state: 'latest' }

6. 模板与文件处理

Jinja2模板示例

# templates/nginx.conf.j2
server {
    listen {{ nginx_port }};
    root {{ nginx_root }};

    location / {
        index index.html;
    }
}

文件复制与权限设置

tasks:
  - name: 复制配置文件
    copy:
      src: files/app.conf
      dest: /etc/app/app.conf
      owner: root
      group: root
      mode: '0644'

  - name: 创建目录
    file:
      path: /var/www/myapp
      state: directory
      mode: '0755'

7. 错误处理

忽略错误

tasks:
  - name: 尝试删除文件
    file:
      path: /tmp/nonexistent
      state: absent
    ignore_errors: yes

失败处理

tasks:
  - name: 关键服务检查
    command: /usr/bin/systemctl is-active critical-service
    register: service_status
    failed_when: service_status.rc != 0

重试机制

tasks:
  - name: 重试下载文件
    get_url:
      url: "http://example.com/file.zip"
      dest: "/tmp/file.zip"
    retries: 3
    delay: 10
    until: download_result is succeeded

8. 高级技巧

角色组织结构

roles/
└── nginx/
    ├── tasks/
    │   └── main.yml
    ├── handlers/
    │   └── main.yml
    ├── templates/
    │   └── nginx.conf.j2
    ├── vars/
    │   └── main.yml
    └── defaults/
        └── main.yml

使用角色

---
- name: 配置Web服务器
  hosts: webservers
  roles:
    - { role: nginx, nginx_port: 8080 }
    - common

动态包含任务

tasks:
  - include_tasks: tasks/setup_{{ ansible_os_family }}.yml

9. 调试与测试

语法检查

ansible-playbook --syntax-check playbook.yml

测试模式(不执行修改)

ansible-playbook --check playbook.yml

详细输出

ansible-playbook -v playbook.yml
ansible-playbook -vvvv playbook.yml  # 超详细输出

10. 总结

通过本教程,我们系统学习了Ansible Playbook的核心概念和编写技巧:

掌握了Playbook的基本结构与YAML语法

学会了使用变量、条件判断和循环实现动态配置

理解了模板系统如何实现配置文件管理

掌握了错误处理机制提高任务可靠性

了解了角色组织方式实现代码复用

学习了调试与测试方法保障自动化质量

Ansible Playbook的强大之处在于其声明式语法和模块化设计,能够以可读性高、可维护性强的方式管理复杂系统。建议从简单任务开始实践,逐步构建企业级自动化体系。

发表回复

后才能评论