![基于Linux的企业自动化实践:服务器的构建、部署与管理](https://wfqqreader-1252317822.image.myqcloud.com/cover/926/44593926/b_44593926.jpg)
2.4 理解Ansible中的角色
虽然Ansible入门很容易,当剧本很短的时候也很易读,但它确实会变得更复杂,另外需求也会变得更复杂。此外,在不同的场景中,可能需要重复使用某些功能。例如,你可能需要在环境中将MariaDB数据库服务器部署为一个公共任务。一个名为apt的模块用于管理Ubuntu服务器上的包,因此,如果我们想在测试系统上安装mariadb-server软件包,执行此任务的剧本可能如下所示:
![](https://epubservercos.yuewen.com/3E8E5E/23782476101493006/epubprivate/OEBPS/Images/026-2-i.jpg?sign=1738780083-mtgA73xrfZhxhxOXEKvflsbtq6XuSt5g-0-8bfb976ce424a1972fd5dbbfe4e30265)
请注意,这次我们将become设置为true,因为我们需要root权限来安装软件包。当然,这是一个非常简单的示例,因为安装数据库服务器通常需要进行大量的配置工作,但这只是一个起点。我们可以在测试系统上运行它,并产生预期的结果,如图2-6所示。
![](https://epubservercos.yuewen.com/3E8E5E/23782476101493006/epubprivate/OEBPS/Images/2-6.jpg?sign=1738780083-iM1D3Q4BGVlEWbb4g7rh9PLxFg1yUuo5-0-e5dfc39aaa95b45003390e6067f052e7)
图 2-6
到目前为止,一切正常。但是,如果你必须在不同主机的不同剧本中以常规方式执行此操作,你是否真的希望一次又一次地编写(或者实际上是复制和粘贴)此示例的任务代码块呢?而且,这个示例过于简单,实际上,数据库部署代码要复杂得多。如果有人对代码进行了修复或改进,你如何确保将新的代码修订版本传播到所有正确的地方?
这就是角色(role)的由来,而Ansible角色本质上只不过是一组结构化的目录和YAML,它能够高效地重用代码。它还使最初的剧本更容易阅读,我们将很快看到这一点。一旦创建了角色,就可以将它们存储在一个中心位置,例如版本控制存储库(例如GitHub),然后,只要某个剧本需要安装MariaDB,就可以随时访问最新版本。
角色(默认情况下)从与剧本位于同一目录中的名为roles/的子目录中运行。在本书中,我们将使用此约定,但必须说明的是,Ansible还将搜索/etc/ansible/roles中的角色以及Ansible配置文件中roles_path参数指定的路径(默认情况下,可以在/etc/ansible/ansible.cfg文件中找到,尽管有一些方法可以覆盖它)。然后,每个角色在该目录下都有自己的子目录,该目录名构成角色的名称。通过一个简单的示例来探讨这个问题,如下所示:
1.我们将首先创建一个roles/目录,并在它下面建立一个install-mariadb/目录,用于第一个角色:
![](https://epubservercos.yuewen.com/3E8E5E/23782476101493006/epubprivate/OEBPS/Images/027-2-i.jpg?sign=1738780083-OH0SW3Dh96QEG7bkKec5dPKaVUHDsKvW-0-78c073b018b8052a0f598cc0cf856dd6)
2.每个角色下都有一个固定的目录结构,但是对于简单示例,我们只对一个目录感兴趣:tasks/。角色的tasks/子目录下包含该角色被调用时将执行的主任务清单,这些都保存在一个名为main.yml的文件中,创建这个目录,如下所示:
![](https://epubservercos.yuewen.com/3E8E5E/23782476101493006/epubprivate/OEBPS/Images/027-3-i.jpg?sign=1738780083-DmsNNx3xLrVRz852X1Ywequi9ArZeiip-0-927b7a3333e9052f2356009904660d52)
![](https://epubservercos.yuewen.com/3E8E5E/23782476101493006/epubprivate/OEBPS/Images/028-i.jpg?sign=1738780083-n4bpSXml2f6ij4ovMnmYZqetd9CKKDdv-0-121c39ab7e7b790c976fb128b8c0a911)
3.当然,可以使用你喜好的编辑器来代替vi。在main.yml文件中请输入以下代码,注意,它实际上是原始剧本中的任务块,但缩进级别现在已更改:
![](https://epubservercos.yuewen.com/3E8E5E/23782476101493006/epubprivate/OEBPS/Images/028-2-i.jpg?sign=1738780083-R19Mzs9qcZwQnkUJnsoOnY3np8RrMdrJ-0-ad12eb893601a9c65bb51097ce39193f)
4.创建此文件后,我们将编辑原始install-db.yml剧本,使其看起来像这样:
![](https://epubservercos.yuewen.com/3E8E5E/23782476101493006/epubprivate/OEBPS/Images/028-3-i.jpg?sign=1738780083-uB6WSRUfq8R5I8puNWrBa3HXJtfwpyX0-0-77d696769358564d382002ad50ca0a29)
注意,此剧本现在很紧凑,也更容易阅读,但是如果运行它,我们可以看到它执行相同的功能。请注意MariaDB服务器安装任务的状态在上次运行时是changed,但现在是ok。这意味着Ansible检测到mariadb-server软件包已经安装,因此不需要进一步的操作。这是前面提到的幂等变换的一个例子,如图2-7所示。
![](https://epubservercos.yuewen.com/3E8E5E/23782476101493006/epubprivate/OEBPS/Images/2-7.jpg?sign=1738780083-oQXIn3nlDSWWXkmtp43UW4BK3o574RHZ-0-580c4d4704ff9f9b60236c44f06b6a7a)
图 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服务器:
![](https://epubservercos.yuewen.com/3E8E5E/23782476101493006/epubprivate/OEBPS/Images/029-i.jpg?sign=1738780083-usVbXxY1RNfLwTxBly0bnXxrMfqXMpok-0-f5e95ca28317cbaf8c31baad951413ec)
2.现在,我们修改剧本来引用这个角色:
![](https://epubservercos.yuewen.com/3E8E5E/23782476101493006/epubprivate/OEBPS/Images/029-2-i.jpg?sign=1738780083-YqTiE4yUYmWM8WCgmrgRqekifkZf4QBb-0-9cef04accbd39625df2ae45a2f674f55)
3.这就是我们所需要做的全部工作,如果运行它,可以看到这个剧本执行的任务比我们的简单任务要多得多,包括安装新数据库时的许多安全设置,如图2-8所示。
![](https://epubservercos.yuewen.com/3E8E5E/23782476101493006/epubprivate/OEBPS/Images/2-8.jpg?sign=1738780083-cSiTQql38kP8IvSFksJlSz1bYxAH4Osa-0-a4241b16d772d1aba586430d5f7b07e6)
图 2-8
然而,最终的结果是,我们的测试系统上安装了mariadb-server软件包,这一次,我们甚至不需要编写任何代码!当然,明智的做法是,先检查来自Ansible Galaxy的角色将要做什么,而不是盲目地在系统上运行它,以防它做出你没有预料到(或不想要)的更改。尽管如此,角色与Ansible Galaxy一起构成了Ansible所提供的价值的强大补充。
在下一节中,我们将理解一个重要的概念,Ansible变量,它通过使剧本和角色的内容动态化,帮助你最大限度地利用它们。