Playbook是Ansible的主要配置、部署和编排工具。它是一个YAML格式的文件,定义了一系列的任务,每个任务都可以调用一个或多个Ansible模块来执行。Playbook可以非常强大和灵活,支持变量、条件语句、循环和角色等。

编写Playbook

  1. 创建Playbook文件:通常以.yml或.yaml作为文件扩展名。
  2. 定义文档头:使用---来标记YAML文档的开始。
  3. 指定目标主机:使用hosts关键字指定目标主机或主机组。
  4. 编写任务列表:使用tasks关键字定义任务列表,每个任务都是一个字典。
  5. 使用模块:在每个任务中,使用模块来执行具体的操作。

以下是一个简单的Playbook示例,它确保所有主机上安装了Nginx并且正在运行:

---
- hosts: all
  become: yes
  tasks:
    - name: Install Nginx
      yum:
        name: nginx
        state: latest

    - name: Start Nginx
      service:
        name: nginx
        state: started
        enabled: yes

在这个Playbook中:

  • hosts: all 指定了Playbook将在所有主机上执行。
  • become: yes 表示使用特权提升执行任务(例如使用sudo)。
  • 两个任务分别用于安装Nginx和启动Nginx服务。

执行Playbook

  1. 使用ansible-playbook命令:这是执行Playbook的命令。
  2. 指定Playbook文件:将Playbook文件的路径作为参数传递给ansible-playbook命令。

例如,如果你的Playbook文件名为nginx.yml,你可以使用以下命令执行它:

ansible-playbook nginx.yml

Playbook的高级特性

  • 变量:可以在Playbook中定义变量,用于存储可重用的值。
  • Handlers:用于在某些条件发生变化时执行任务,例如当配置文件更改时重启服务。
  • Templates:使用Jinja2模板引擎渲染文件,然后将其传输到远程主机。
  • Roles:将任务分组,以便重用和组织Playbook。
  • 条件语句和循环:使用when和with_items等关键字来添加条件逻辑和循环。

示例:使用变量和角色

以下是一个更复杂的Playbook示例,它使用变量和角色:

---
- hosts: webservers
  become: yes
  vars:
    - nginx_package: nginx
    - nginx_service: nginx

  roles:
    - common
    - webapp

  tasks:
    - name: Install Nginx
      yum:
        name: "{{ nginx_package }}"
        state: latest

    - name: Start Nginx
      service:
        name: "{{ nginx_service }}"
        state: started
        enabled: yes

  handlers:
    - name: Restart Nginx
      service:
        name: "{{ nginx_service }}"
        state: restarted

在这个Playbook中:

  • vars 定义了两个变量,用于存储Nginx的包名和服务名。
  • roles 指定了两个角色,这些角色可以包含一组预先定义的任务。
  • handlers 定义了一个名为Restart Nginx的处理程序,它将在需要时重启Nginx服务。

调试Playbook

  • 增加输出:使用-v(verbose)或-vvv(more verbose)选项来增加ansible-playbook命令的输出详细程度。
  • 检查语法:使用--syntax-check选项来检查Playbook的语法是否正确,而不执行它。
ansible-playbook nginx.yml --syntax-check

编写和执行Playbook是Ansible自动化的核心,通过熟练使用Playbook,你可以有效地管理和部署复杂的基础设施。