介绍
在本实验中,你将学习 Ansible playbook 的基础知识。Ansible playbook 是 YAML 文件,用于描述在远程主机上执行的一系列任务。它们是复杂 IT 自动化工作流的构建模块。你将创建你的第一个 playbook,了解其结构,并学习如何执行它。通过本实验,你将获得编写和运行 Ansible playbook 的实践经验,这将为进一步学习高级 Ansible 使用打下基础。
在本实验中,你将学习 Ansible playbook 的基础知识。Ansible playbook 是 YAML 文件,用于描述在远程主机上执行的一系列任务。它们是复杂 IT 自动化工作流的构建模块。你将创建你的第一个 playbook,了解其结构,并学习如何执行它。通过本实验,你将获得编写和运行 Ansible playbook 的实践经验,这将为进一步学习高级 Ansible 使用打下基础。
让我们从创建一个简单的 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
用于描述。这有助于你理解每个任务的功能,并使故障排除更加容易。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 的结构对于未来编写更复杂的自动化任务至关重要。
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 版本有助于理解每个元素的结构和用途。以下是一些需要记住的关键点:
-
) 开头。在本例中,我们只有一个 play。hosts
字段指定 play 应在哪些机器上运行。file
和 copy
)来执行操作。Ansible 有许多内置模块,用于各种用途。file
模块功能多样,可用于创建、修改或删除文件和目录。在本例中,我们使用它来创建目录。
copy
模块用于将文件复制到远程位置,或者像本例中一样,创建具有特定内容的新文件。
理解这些基本结构将帮助你在将来创建更复杂的 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 中的更改和新元素:
我们添加了一个 vars
部分来定义变量。这是你可以设置将在 playbook 中多次使用的值的地方。
dir_path
和 file_content
现在是变量。我们可以轻松地在一个地方更改这些值,以影响多个任务。
我们使用 {{ }}
语法来引用变量。这告诉 Ansible 用变量的值替换它。
我们使用了 Ansible 内置的 ansible_date_time.iso8601
变量来包含当前时间戳。Ansible 提供了许多这样的变量,你可以在 playbook 中使用。
添加了一个使用 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 更加动态和可重用。
本实验的关键要点:
file
、copy
和 debug
模块。{{ }}
语法引用。debug
模块在 playbook 执行期间显示信息非常有用,这有助于故障排除。随着你继续学习 Ansible,你会发现 playbook 是自动化复杂 IT 任务的强大工具。尝试为各种场景编写 playbook,以更熟悉其结构和功能。尝试修改我们今天创建的 playbook——更改目录路径、添加更多任务或使用不同的模块。
在未来的实验中,你将学习更高级的 playbook 功能,例如条件语句、循环和角色,这些功能将使你能够创建更强大和灵活的自动化工作流。
请记住,掌握 Ansible 的关键在于实践和探索。不要害怕在你的 playbook 中尝试不同的模块和结构。Ansible 文档是你继续学习和提升技能的绝佳资源。