购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4 理解Ansible中的角色

虽然Ansible入门很容易,当剧本很短的时候也很易读,但它确实会变得更复杂,另外需求也会变得更复杂。此外,在不同的场景中,可能需要重复使用某些功能。例如,你可能需要在环境中将MariaDB数据库服务器部署为一个公共任务。一个名为apt的模块用于管理Ubuntu服务器上的包,因此,如果我们想在测试系统上安装mariadb-server软件包,执行此任务的剧本可能如下所示:

请注意,这次我们将become设置为true,因为我们需要root权限来安装软件包。当然,这是一个非常简单的示例,因为安装数据库服务器通常需要进行大量的配置工作,但这只是一个起点。我们可以在测试系统上运行它,并产生预期的结果,如图2-6所示。

图 2-6

到目前为止,一切正常。但是,如果你必须在不同主机的不同剧本中以常规方式执行此操作,你是否真的希望一次又一次地编写(或者实际上是复制和粘贴)此示例的任务代码块呢?而且,这个示例过于简单,实际上,数据库部署代码要复杂得多。如果有人对代码进行了修复或改进,你如何确保将新的代码修订版本传播到所有正确的地方?

这就是角色(role)的由来,而Ansible角色本质上只不过是一组结构化的目录和YAML,它能够高效地重用代码。它还使最初的剧本更容易阅读,我们将很快看到这一点。一旦创建了角色,就可以将它们存储在一个中心位置,例如版本控制存储库(例如GitHub),然后,只要某个剧本需要安装MariaDB,就可以随时访问最新版本。

角色(默认情况下)从与剧本位于同一目录中的名为roles/的子目录中运行。在本书中,我们将使用此约定,但必须说明的是,Ansible还将搜索/etc/ansible/roles中的角色以及Ansible配置文件中roles_path参数指定的路径(默认情况下,可以在/etc/ansible/ansible.cfg文件中找到,尽管有一些方法可以覆盖它)。然后,每个角色在该目录下都有自己的子目录,该目录名构成角色的名称。通过一个简单的示例来探讨这个问题,如下所示:

1.我们将首先创建一个roles/目录,并在它下面建立一个install-mariadb/目录,用于第一个角色:

2.每个角色下都有一个固定的目录结构,但是对于简单示例,我们只对一个目录感兴趣:tasks/。角色的tasks/子目录下包含该角色被调用时将执行的主任务清单,这些都保存在一个名为main.yml的文件中,创建这个目录,如下所示:

3.当然,可以使用你喜好的编辑器来代替vi。在main.yml文件中请输入以下代码,注意,它实际上是原始剧本中的任务块,但缩进级别现在已更改:

4.创建此文件后,我们将编辑原始install-db.yml剧本,使其看起来像这样:

注意,此剧本现在很紧凑,也更容易阅读,但是如果运行它,我们可以看到它执行相同的功能。请注意MariaDB服务器安装任务的状态在上次运行时是changed,但现在是ok。这意味着Ansible检测到mariadb-server软件包已经安装,因此不需要进一步的操作。这是前面提到的幂等变换的一个例子,如图2-7所示。

图 2-7

你已经创建并执行了第一个角色。如果想了解更多有关角色和所需目录结构的信息,请参阅https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html。

角色的意义甚至不止于此,它们不仅在构建剧本和实现代码重用方面非常宝贵,还有一个用于社区贡献角色的中央存储库,称为Ansible Galaxy。如果在Ansible Galaxy中搜索与MariaDB相关的角色,你将发现277个(在撰写本书时的数量)不同的角色,它们都是为执行各种数据库安装任务而设计的。这意味着你甚至不必为常见任务编写自己的角色——你可以使用社区贡献的角色,也可以将它们分叉,并根据自己的目的修改它们。大多数常见的服务器自动化任务已经在Ansible社区的某个地方得到了解决,因此你很可能会找到你想要的东西。

现在让我们测试一下,如下所示:

1.首先,从Ansible Galaxy安装一个角色,此角色在Ubuntu上安装MariaDB服务器:

2.现在,我们修改剧本来引用这个角色:

3.这就是我们所需要做的全部工作,如果运行它,可以看到这个剧本执行的任务比我们的简单任务要多得多,包括安装新数据库时的许多安全设置,如图2-8所示。

图 2-8

然而,最终的结果是,我们的测试系统上安装了mariadb-server软件包,这一次,我们甚至不需要编写任何代码!当然,明智的做法是,先检查来自Ansible Galaxy的角色将要做什么,而不是盲目地在系统上运行它,以防它做出你没有预料到(或不想要)的更改。尽管如此,角色与Ansible Galaxy一起构成了Ansible所提供的价值的强大补充。

在下一节中,我们将理解一个重要的概念,Ansible变量,它通过使剧本和角色的内容动态化,帮助你最大限度地利用它们。 AGgmqrdMWiG0IlB27yMNkozKLYoysvMM8IErhU9zZYEB615QijwK1bqTOhVOLThW

点击中间区域
呼出菜单
上一章
目录
下一章
×