Ansible Playbook 如何创建和配置剧本


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

什么是 Ansible 剧本?

Ansible 剧本是一个 YAML 文件,描述了一组要在一个或多个主机上执行的任务。剧本是 Ansible 自动化的核心,提供了一种结构化的方式来定义和按特定顺序执行任务。剧本是用 YAML 编写的,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”)。我们定义了一个名为“安装 Apache2”的任务,该任务使用 apt 模块安装最新版本的 Apache2 Web 服务器。最后,我们定义了一个名为“重新启动 Apache2”的处理器,该处理器在任务更改它时使用 service 模块重新启动 Apache2 服务。

执行 Ansible 剧本

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

ansible-playbook playbook.yml

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

Ansible 剧本的高级功能

Ansible 剧本提供了许多高级功能,允许您自动化复杂的任务和配置。以下是一些示例:

循环

循环允许您对列表中的每个项目重复一个任务。例如,当安装多个软件包或创建多个文件时,这很有用。以下是一个使用循环安装多个软件包的剧本示例:

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

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

条件语句

条件语句允许您根据某些条件执行任务。例如,当仅在尚未安装软件包时才安装软件包时,这很有用。以下是一个仅在尚未安装软件包时才安装软件包的剧本示例:

---
- 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”模块在剧本中包含此角色:

---
- 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 剧本允许您使用 Ansible Vault 对敏感数据进行加密。Vault 提供了一种方法以加密格式存储和管理敏感数据,例如密码、API 密钥和 SSH 密钥。以下是一个使用 Ansible Vault 的剧本示例:

---
- 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 剧本,现在就开始吧!

更新于: 2023年5月2日

705 次查看

开启您的 职业生涯

通过完成课程获得认证

开始
广告