Ansible 是 自动化和编排 领域的主要工具之一,因为它具有广泛的用途和灵活性。然而,这些相同的特性也是它难以入门 Ansible 的原因。它不是图形应用程序,但也不是脚本或编程语言。但与编程语言一样,对于常见问题“我可以用它做什么?”的答案是“一切”,这使得很难知道从哪里开始做任何事情。
以下是我对 Ansible 的看法:它是一个“引擎”,使用其他人的模块来完成您在名为 YAML 的特殊“伪代码”文本格式中描述的复杂任务。这意味着您需要具备以下三件事才能开始使用 Ansible
- Ansible
- 您想要自动化的重复性任务
- 对 YAML 的基本了解
本文旨在帮助您开始使用这三件事。
安装 Ansible
Ansible 广受欢迎的部分原因在于它允许您(用户)完全忽略您要定位的操作系统 (OS)。通常,您不必考虑您的 Ansible 任务是否将在 Linux、macOS、Windows 或 BSD 上执行。Ansible 会为您处理特定于平台的繁琐细节。
但是,要运行 Ansible,您确实需要在某处安装 Ansible。安装 Ansible 的计算机称为控制节点。Ansible 定位的任何计算机都称为主机。
只有控制节点需要安装 Ansible。
如果您使用的是 Linux,则可以使用软件包管理器从软件存储库安装 Ansible。
到目前为止,Windows 还不能充当 Ansible 控制节点,尽管它在 POSIX 方面取得了更多进展,情况看起来会更好,因此请密切关注 Microsoft 的 适用于 Linux 的 Windows 子系统 (WSL) 产品。
在 macOS 上,您可以使用第三方软件包管理器,例如 Homebrew 或 MacPorts。
Ansible 模块
Ansible 只是一个引擎。完成 90% 工作的部件是 Ansible 模块。这些模块由世界各地的许多不同的人员编程。有些变得非常流行,以至于 Ansible 团队采纳了它们并帮助维护它们。
作为用户,您与 Ansible 的大部分交互都指向其模块。选择模块就像在手机或计算机上选择应用程序一样:您有一个想要完成的任务,因此您寻找一个声称可以帮助您的 Ansible 模块。
大多数模块都与特定应用程序相关联。例如,file 模块有助于创建和管理文件。authorized_key 模块有助于管理 SSH 密钥,数据库 模块有助于控制和操作数据库,等等。
决定将任务卸载到 Ansible 的一部分是找到可以帮助您完成任务的模块。Ansible playbook 运行任务,任务由 Ansible 关键字或 Ansible 模块组成。
YAML 和 Ansible
YAML 文本格式是一种高度结构化的方式,用于向应用程序提供指令,使其几乎成为一种代码形式。与编程语言一样,您必须根据特定的语法规则编写 YAML。旨在用于 Ansible 的 YAML 文件称为playbook,它由一个或多个 Ansible play 组成。
Ansible play 与 YAML 一样,具有非常有限的结构。有两种类型的指令:序列和映射。Ansible play 与 YAML 一样,始终以 3 个破折号 (---
) 开头。
序列
序列元素是一个列表。例如,这是一个 YAML 中的企鹅物种列表
---
- Emperor
- Gentoo
- Yellow-eyed
----
映射
映射元素由两部分组成:键和值。Ansible 中的键通常是由 Ansible 模块定义的关键字,值有时是布尔值(true
或 false
)或由模块定义的一些参数选择,或者是一些任意值、变量,具体取决于设置的内容。
这是一个 YAML 中的简单映射
---
- Name: "A list of penguin species"
----
序列和映射
这两种数据类型不是互斥的。
您可以将序列放入映射中。在这种情况下,序列是映射键的值。将序列放入映射时,您需要缩进序列,使其成为其键的“后代”(或“子项”)
---
- Penguins:
- Emperor
- Gentoo
- Yellow-eyed
----
您也可以将映射放入序列中
---
- Penguin: Emperor
- Mammal: Gnu
- Planar: Demon
----
这些是您需要熟悉的所有规则才能编写有效的 YAML。
编写 Ansible play
对于 Ansible playbook,您是否使用序列或映射(或序列中的映射,或映射中的序列)由 Ansible 或您正在使用的 Ansible 模块决定。Ansible 的“语言”主要用于配置选项,以帮助您确定您的 playbook 将如何以及在何处运行。有关所有 Ansible 关键字的快速参考,请参阅 Ansible playbook 文档。
从关键字列表中,您可以为您的 playbook 创建一个开头。您从三个破折号开始,因为 YAML 文件总是这样开始。然后,您在映射块中为您的 playbook 命名。您还必须定义您希望 playbook 在哪些主机(计算机)上运行,以及 Ansible 如何访问计算机。
在本例中,我将主机设置为 localhost
,因此 playbook 仅在这台计算机上运行,并将连接类型设置为 local
(默认值为 ssh
)
---
- name: "My first Ansible play"
hosts: localhost
connection: local
----
您在 playbook 中编写的大部分 YAML 可能是特定 Ansible 模块的配置选项。要了解模块期望您的 Ansible playbook 提供哪些指令,请参阅该模块的文档。Ansible 维护的模块记录在 Ansible 的网站上。
在本例中,我将使用 debug 模块。

opensource.com
在 debug 的文档页面上,列出了三个参数
msg
是一个可选字符串,用于打印到终端。var
是一个可选变量,解释为字符串。它与msg
互斥,因此您可以使用其中一个,而不是两者都使用。verbosity
是一个整数,您可以使用它来控制此调试器的详细程度。其默认值为 0,因此没有通过阈值。
这是一个简单的模块,但要查找的是每个参数的 YAML 数据类型。您能从我的描述中确定这些参数是序列(列表)还是映射(键值对)吗?了解在您的 playbook 中使用哪种 YAML 块可以帮助您编写有效的 playbook。
这是一个简单的“hello world”Ansible playbook
---
- name: "My first Ansible play"
hosts: localhost
connection: local
tasks:
- name: "Print a greeting"
debug:
msg: "Hello world"
----
请注意,playbook 包含一个 task
。此任务是一个映射,其中包含一个项目的序列。此任务中的项目是 name
(及其值)、任务正在使用的模块和 msg
参数(及其值)。这些都是任务映射的一部分,因此它们被缩进以显示继承关系。
您可以使用带有 --check
选项的 ansible-playbook
命令来测试此 Ansible playbook
$ ansible-playbook --check hello.yaml
PLAY [My first Ansible play] *************************
TASK [Gathering Facts] *******************************
ok: [localhost]
TASK [Print a greeting] ******************************
ok: [localhost] => {
"msg": "Hello world"
}
PLAY RECAP *******************************************
localhost: ok=2 changed=0 unreachable=0 failed=0
它很详细,但您可以在“Print a greeting”任务中调试消息,就在您放置它的位置。
测试模块
使用新的 Ansible 模块就像尝试新的 Linux 命令一样。您阅读其文档,研究其语法,然后尝试一些测试。
至少还有两个模块可以用来编写“hello world”playbook:assert 和 meta。尝试通读这些模块的文档,看看您是否可以根据您上面学到的知识创建一个简单的测试 playbook。
有关如何使用模块完成工作的更多示例,请访问 Ansible Galaxy,这是一个社区贡献的 playbook 的开源存储库。
评论已关闭。