Ansible Playbook 基础

AnsibleAnsibleBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,你将学习 Ansible playbook 的基础知识。Ansible playbook 是 YAML 文件,用于描述在远程主机上执行的一系列任务。它们是复杂 IT 自动化工作流的构建模块。你将创建你的第一个 playbook,了解其结构,并学习如何执行它。通过本实验,你将获得编写和运行 Ansible playbook 的实践经验,这将为进一步学习高级 Ansible 使用打下基础。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("`Linux`")) -.-> linux/BasicFileOperationsGroup(["`Basic File Operations`"]) linux(("`Linux`")) -.-> linux/FileandDirectoryManagementGroup(["`File and Directory Management`"]) ansible(("`Ansible`")) -.-> ansible/InventoryManagementGroup(["`Inventory Management`"]) ansible(("`Ansible`")) -.-> ansible/PlaybookEssentialsGroup(["`Playbook Essentials`"]) linux/BasicFileOperationsGroup -.-> linux/touch("`File Creating/Updating`") linux/FileandDirectoryManagementGroup -.-> linux/mkdir("`Directory Creating`") ansible/InventoryManagementGroup -.-> ansible/host_variables("`Set Host Variables`") ansible/PlaybookEssentialsGroup -.-> ansible/playbook("`Execute Playbook`") subgraph Lab Skills linux/touch -.-> lab-390426{{"`Ansible Playbook 基础`"}} linux/mkdir -.-> lab-390426{{"`Ansible Playbook 基础`"}} ansible/host_variables -.-> lab-390426{{"`Ansible Playbook 基础`"}} ansible/playbook -.-> lab-390426{{"`Ansible Playbook 基础`"}} end

创建你的第一个 Playbook

让我们从创建一个简单的 Ansible playbook 开始,它将在本地机器上创建一个目录和一个文件。这将帮助你理解 playbook 的基本结构以及如何执行它。

首先,在 /home/labex/project 目录下创建一个名为 first_playbook.yml 的新文件:

nano /home/labex/project/first_playbook.yml

此命令将打开 nano 文本编辑器。如果你不熟悉 nano,不用担心——它是一个简单的文本编辑器。你可以直接在其中输入内容。

现在,将以下内容添加到文件中:

---
- name: My First Playbook
  hosts: localhost
  connection: local
  tasks:
    - name: Create a directory
      file:
        path: /home/labex/project/test_directory
        state: directory
        mode: "0755"

    - name: Create a file
      copy:
        content: "Hello from Ansible!"
        dest: /home/labex/project/test_directory/hello.txt

让我们分解这个 playbook 以理解每个部分:

  • 顶部的 --- 标记了 YAML 文件的开始。YAML 是 Ansible playbook 使用的格式。
  • name: My First Playbook 是此 play 的描述性名称。它帮助你识别此 playbook 的功能。
  • hosts: localhost 指定此 playbook 将在本地机器上运行。在实际场景中,你可能会在此处指定远程主机。
  • connection: local 告诉 Ansible 在本地运行 playbook,而不是使用 SSH。这对于测试和需要在 Ansible 控制节点本身执行的任务非常有用。
  • tasks: 后面是要执行的任务列表。每个任务是你希望 Ansible 执行的操作。
  • 每个任务都有一个 name 用于描述。这有助于你理解每个任务的功能,并使故障排除更加容易。
  • 任务使用 Ansible 模块:
    • file 模块用于创建目录。
    • copy 模块用于创建具有特定内容的文件。

如果你还不了解所有模块,请不要担心。随着学习的深入,你将了解更多模块及其用途。

保存并退出编辑器。在 nano 中,你可以通过按 Ctrl+X,然后按 Y,最后按 Enter 来完成。

现在,让我们运行这个 playbook。在终端中输入:

ansible-playbook /home/labex/project/first_playbook.yml

此命令告诉 Ansible 运行我们刚刚创建的 playbook。你应该会看到类似以下的输出:

PLAY [My First Playbook] ******************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create a directory] ******************************************************
changed: [localhost]

TASK [Create a file] ***********************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

此输出显示 Ansible 成功执行了我们的任务。"changed" 状态表示 Ansible 对系统进行了更改(创建了目录和文件)。

如果你想手动验证结果,可以使用以下命令:

ls -l /home/labex/project/test_directory
cat /home/labex/project/test_directory/hello.txt

第一个命令应显示我们创建的目录,第二个命令应显示我们创建的文件内容。

理解 Playbook 结构

现在你已经创建并运行了你的第一个 playbook,让我们更深入地了解其结构。理解 playbook 的结构对于未来编写更复杂的自动化任务至关重要。

Ansible playbook 由一个或多个 play 组成,每个 play 包含几个关键元素。让我们编辑 first_playbook.yml 文件,添加注释以解释每个部分:

nano /home/labex/project/first_playbook.yml

更新内容如下:

---
## Playbook 以三个破折号开始
- name: My First Playbook ## Play 的名称
  hosts: localhost ## 此 play 的目标主机
  connection: local ## 连接类型(此处为本地)

  tasks: ## 要执行的任务列表
    - name: Create a directory ## 第一个任务的名称
      file: ## 此任务使用 'file' 模块
        path: /home/labex/project/test_directory ## 要创建的目录路径
        state: directory ## 期望的状态(创建目录)
        mode: "0755" ## 目录的权限

    - name: Create a file ## 第二个任务的名称
      copy: ## 此任务使用 'copy' 模块
        content: "Hello from Ansible!" ## 要写入文件的内容
        dest: /home/labex/project/test_directory/hello.txt ## 文件的目标路径

保存并退出编辑器。

这个带注释的 playbook 版本有助于理解每个元素的结构和用途。以下是一些需要记住的关键点:

  1. 一个 playbook 可以包含多个 play,每个 play 以破折号 (-) 开头。在本例中,我们只有一个 play。
  2. 每个 play 针对特定的主机并定义一系列任务。hosts 字段指定 play 应在哪些机器上运行。
  3. 任务使用 Ansible 模块(如 filecopy)来执行操作。Ansible 有许多内置模块,用于各种用途。
  4. 每个任务应具有描述性名称。这有助于理解任务的功能以及进行故障排除。
  5. 在 YAML 文件中,缩进至关重要。确保你的 playbook 正确缩进。不正确的缩进可能导致运行 playbook 时出错。

file 模块功能多样,可用于创建、修改或删除文件和目录。在本例中,我们使用它来创建目录。

copy 模块用于将文件复制到远程位置,或者像本例中一样,创建具有特定内容的新文件。

理解这些基本结构将帮助你在将来创建更复杂的 playbook。

在 Playbook 中添加变量

变量使你的 playbook 更加灵活和可重用。它们允许你编写能够适应不同场景的 playbook,而无需更改 playbook 本身。让我们修改我们的 playbook 以使用变量。

编辑 first_playbook.yml 文件:

nano /home/labex/project/first_playbook.yml

更新内容如下:

---
- name: My First Playbook
  hosts: localhost
  connection: local
  vars:
    dir_path: /home/labex/project/test_directory
    file_content: "Hello from Ansible! The time is {{ ansible_date_time.iso8601 }}"

  tasks:
    - name: Create a directory
      file:
        path: "{{ dir_path }}"
        state: directory
        mode: "0755"

    - name: Create a file
      copy:
        content: "{{ file_content }}"
        dest: "{{ dir_path }}/hello.txt"

    - name: Display file content
      debug:
        msg: "The content of the file is: {{ file_content }}"

让我们分解此更新后的 playbook 中的更改和新元素:

  1. 我们添加了一个 vars 部分来定义变量。这是你可以设置将在 playbook 中多次使用的值的地方。

  2. dir_pathfile_content 现在是变量。我们可以轻松地在一个地方更改这些值,以影响多个任务。

  3. 我们使用 {{ }} 语法来引用变量。这告诉 Ansible 用变量的值替换它。

  4. 我们使用了 Ansible 内置的 ansible_date_time.iso8601 变量来包含当前时间戳。Ansible 提供了许多这样的变量,你可以在 playbook 中使用。

  5. 添加了一个使用 debug 模块的新任务。debug 模块在 playbook 执行期间显示信息非常有用,这有助于故障排除。

变量的使用使此 playbook 更加灵活。例如,如果你想更改目录路径,只需在 vars 部分更改它,而无需在每个任务中更改。

保存并退出编辑器。

现在,让我们运行更新后的 playbook:

ansible-playbook /home/labex/project/first_playbook.yml

你应该会看到显示任务正在执行的输出,包括显示带有当前时间戳的文件内容的调试消息。输出将类似于以下内容:

PLAY [My First Playbook] ******************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create a directory] ******************************************************
ok: [localhost]

TASK [Create a file] ***********************************************************
changed: [localhost]

TASK [Display file content] ****************************************************
ok: [localhost] => {
    "msg": "The content of the file is: Hello from Ansible! The time is 2023-06-09T12:34:56Z"
}

PLAY RECAP *********************************************************************
localhost                  : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

实际时间戳在你运行 playbook 时会有所不同。

这演示了变量如何使你的 playbook 更加动态。文件内容现在包含一个时间戳,每次运行 playbook 时都会不同。

总结

在本实验中,你学习了 Ansible playbook 的基础知识。从创建第一个简单的 playbook 开始,到理解其结构并使用变量使你的 playbook 更加动态和可重用。

本实验的关键要点:

  1. Ansible playbook 以 YAML 格式编写,描述了在指定主机上执行的一系列任务。
  2. 一个 playbook 由一个或多个 play 组成,每个 play 包含一系列任务。
  3. 任务使用 Ansible 模块在目标主机上执行操作。在本实验中,我们使用了 filecopydebug 模块。
  4. 可以在 playbook 中定义和使用变量以提高灵活性和可重用性。变量使用 {{ }} 语法引用。
  5. debug 模块在 playbook 执行期间显示信息非常有用,这有助于故障排除。
  6. 在 YAML 文件和 Ansible playbook 中,正确的缩进至关重要。

随着你继续学习 Ansible,你会发现 playbook 是自动化复杂 IT 任务的强大工具。尝试为各种场景编写 playbook,以更熟悉其结构和功能。尝试修改我们今天创建的 playbook——更改目录路径、添加更多任务或使用不同的模块。

在未来的实验中,你将学习更高级的 playbook 功能,例如条件语句、循环和角色,这些功能将使你能够创建更强大和灵活的自动化工作流。

请记住,掌握 Ansible 的关键在于实践和探索。不要害怕在你的 playbook 中尝试不同的模块和结构。Ansible 文档是你继续学习和提升技能的绝佳资源。

您可能感兴趣的其他 Ansible 教程