Ansible Playbook 如何创建和配置 Playbook

linuxoperating systemopen source更新于 2026/2/1 7:37:17

如果您是系统管理员或 DevOps 工程师,您一定知道自动化在日常运营中的重要性。Ansible 是最流行的自动化工具之一,它是一款配置管理工具,可以简化服务器、网络设备和其他 IT 基础设施的管理。在本文中,我们将深入探讨 Ansible Playbook,它是 Ansible 的一项强大功能,可让您自动执行复杂的任务和配置。

什么是 Ansible Playbook?

Ansible Playbook 是一个 YAML 文件,它描述了一组要在一台或多台主机上执行的任务。Playbook 是 Ansible 自动化的核心,它提供了一种结构化的方式来按特定顺序定义和执行任务。Playbook 使用 YAML(一种人类可读的数据序列化语言)编写,并且可以像任何其他文本文件一样进行版本控制。即使对于非程序员来说,剧本也易于阅读、编写和理解。

Ansible 剧本的剖析

Ansible 剧本由四个主要组件组成 -

  • 主机 - 将在其上执行任务的目标主机。可以使用 IP 地址、主机名或与主机组匹配的模式来定义主机。

  • 变量 - 变量定义剧本中任务使用的数据。变量可以在剧本级别或任务级别定义。它们也可以设置为默认值,或基于每个主机或每个组进行覆盖。

  • 任务 - 任务定义要在目标主机上执行的操作。任务可以由模块组成,这些模块是预先构建的 Ansible 脚本,用于执行特定功能,例如管理文件、安装软件包或重启服务。

  • 处理程序 - 处理程序定义响应任务触发的事件时要执行的操作。处理程序类似于任务,但仅在收到任务通知时才会执行。例如,处理程序可用于仅在服务被任务更改后重启服务。

创建 Ansible 剧本

创建 Ansible 剧本非常简单。首先,您需要创建一个 YAML 文件并定义主机、变量、任务和处理程序。以下是一个简单的剧本示例,用于在一组主机上安装软件包 -

---
- hosts: webservers
	become: yes
	tasks:
	- name: Install Apache2
	apt:
		name: apache2
		state: latest
	handlers:
	- name: Restart Apache2
	service:
		name: apache2
		state: restarted

在此示例中,我们定义了一个名为"webservers"的主机组,并指示我们希望以 root 用户身份运行任务(使用"become: yes")。我们定义了一个名为"Install Apache2"的任务,该任务使用 apt 模块安装最新版本的 Apache2 Web 服务器。最后,我们定义了一个名为"Restart Apache2"的处理程序,该处理程序使用服务模块在 Apache2 服务被任务更改时重新启动它。

执行 Ansible Playbook

创建 playbook 后,您可以使用"ansible-playbook"命令执行它。以下是如何执行我们之前创建的 playbook 的示例 -

ansible-playbook playbook.yml

此命令将在"webservers"组中定义的所有主机上执行 playbook。Ansible 将通过 SSH 连接到每个主机,并按照 playbook 中定义的顺序执行任务。 Ansible 还会收集并显示每个任务和处理程序的输出。

Ansible Playbook 的高级功能

Ansible Playbook 提供了许多高级功能,可让您自动执行复杂的任务和配置。以下是一些示例 -

循环

循环允许您对列表中的每个项目重复执行同一任务。例如,在安装多个软件包或创建多个文件时,这非常有用。以下是一个使用循环安装多个软件包的 Playbook 示例 -

---
- hosts: webservers
  become: yes
  vars:
	packages:
	- apache2
	- mysql-server
	- php
  tasks:
  - name: Install packages
	apt:
		name: "{{ item }}"
		state: latest
	loop: "{{ packages }}"

在此示例中,我们定义一个名为"packages"的变量,其中包含软件包名称列表。然后,我们使用循环遍历列表,并使用 apt 模块安装每个软件包。

条件语句

条件语句允许您根据特定条件执行任务。例如,仅在软件包尚未安装时才安装它时,这非常有用。以下是一个 playbook 示例,该 playbook 仅在软件包尚未安装时才安装它 -

---
- hosts: webservers
  become: yes
  vars:
    package: apache2
  tasks:
  - name: Check if package is installed
    command: "dpkg -s {{ package }}"
    register: result
    ignore_errors: true
  - name: Install package
    apt:
      name: "{{ package }}"
      state: latest
    when: result.rc != 0

在此示例中,我们定义了一个名为"package"的变量,其中包含待安装软件包的名称。我们使用"command"模块检查软件包是否已安装,并将结果注册到名为"result"的变量中。然后,我们使用条件语句,仅当命令返回非零状态码(表示软件包尚未安装)时才安装软件包。

角色

角色允许您将剧本组织成可重复使用的工作单元。角色包含特定于特定函数或应用程序的任务、处理程序、变量和文件。角色可以在多个剧本之间共享和重用。以下是一个安装软件包的简单角色示例 -

---
- name: Install Apache2
  become: yes
  apt:
    name: apache2
    state: latest

在本例中,我们定义了一个名为"apache2"的角色,该角色使用 apt 模块安装 Apache2 软件包。然后,我们可以使用"include_role"模块将此角色添加到 playbook 中 -

---
- hosts: webservers
  become: yes
  tasks:
  - name: Install Apache2
    include_role:
      name: apache2

在此示例中,我们使用"include_role"模块将"apache2"角色添加到我们的剧本中。Ansible 将自动执行角色中定义的任务。

以下是 Ansible 剧本的一些高级功能,您可以使用它们来自动化您的基础设施 -

变量和模板

Ansible 剧本允许您使用变量在任务之间传递值、定义默认值以及覆盖特定主机或组的值。您还可以使用模板根据变量动态生成配置文件。以下是一个使用变量和模板的剧本示例 -

---
- hosts: webservers
  become: yes
  vars:
    server_name: example.com
    document_root: /var/www/html
  tasks:
  - name: Create virtual host file
    template:
      src: virtualhost.j2
      dest: /etc/apache2/sites-available/{{ server_name }}
  - name: Enable virtual host
    command: "a2ensite {{ server_name }}"
  - name: Create document root
    file:
      path: "{{ document_root }}"
      state: directory

在此示例中,我们定义了服务器名称和文档根目录的变量。然后,我们使用模板模块基于名为"virtualhost.j2"的 Jinja2 模板生成虚拟主机配置文件。我们使用"command"模块启用虚拟主机,并使用"file"模块创建文档根目录。

标签

Ansible 剧本允许您为任务分配标签,从而允许您根据标签选择性地执行任务。这在调试或测试剧本时非常有用。以下是一个使用标签的剧本示例 -

---
- hosts: webservers
  become: yes
  tasks:
  - name: Install Apache2
    apt:
      name: apache2
      state: latest
    tags: apache
  - name: Install MySQL
    apt:
      name: mysql-server
      state: latest
    tags: mysql

在此示例中,我们为两个任务分配了标签"apache"和"mysql"。然后,我们可以使用"ansible-playbook"命令仅执行带有特定标签的任务 -

ansible-playbook playbook.yml --tags apache

此命令将仅执行带有"apache"标签的任务。

Vault

Ansible playbook 允许您使用 Ansible Vault 加密敏感数据。Vault 提供了一种以加密格式存储和管理敏感数据(例如密码、API 密钥和 SSH 密钥)的方法。以下是使用 Ansible Vault 的 playbook 示例 -

---
- hosts: webservers
  become: yes
  vars:
    db_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          61646566336461333462323466633435386366663433663237663731346662336434303863316535
  tasks:
  - name: Create database user
    mysql_user:
      name: dbuser
      password: "{{ db_password }}"
      priv: '*.*:ALL,GRANT'

在本例中,我们定义了一个名为"db_password"的变量,并使用 Ansible Vault 加密。然后,我们使用"mysql_user"模块创建数据库用户,并使用"{{ }}"语法传递加密的密码。

结论

Ansible 剧本是自动化 IT 基础架构的强大工具。剧本提供了一种结构化的方式,可以按特定顺序定义和执行任务,从而轻松实现复杂配置的自动化。即使对于非程序员来说,剧本也易于阅读、编写和理解。Ansible 提供了许多高级功能,例如循环、条件和角色,可让您轻松地自动化复杂的任务和配置。如果您还没有使用过 Ansible 剧本,现在是时候开始了!


相关文章


有用资源