二维码

Ansible,第四部分:将所有内容放在一起

1246 人阅读 | 时间:2020年01月03日 14:07

角色是Ansible学习中最复杂,最简单的方面。

我之前已经提到过,Ansible的临时模式通常只是作为学习如何使用Ansible的一种方式而被忽略。我再也不能比以前更加反对这种想法了。临时模式实际上是我每天最常使用的模式。也就是说,使用剧本和角色是利用Ansible功能的非常有效的方法。实际上,当大多数人想到Ansible时,他们往往会想到角色功能,因为这是大多数Ansible代码共享的方式。因此,首先,重要的是要了解即席模式,剧本和角色之间的关系。

临时模式

这有点回顾,但是一旦开始创建剧本,很容易忘记。临时模式只是一种单行代码,它使用Ansible模块在一组计算机上完成给定的任务。就像是:

ansible cadlab -b -m yum -a "name=vim state=latest"

将在cadlab组中的每台计算机上安装vim。-b 提升特权的 信号(成为“根”), -m使用该 yum模块的方式以及-a说出要采取的措施。在这种情况下,它将安装最新版本的vim。

通常,当我使用临时模式安装软件包时,我将遵循以下步骤:

ansible cadlab -b -m service -a "name=httpd state=started
 ↪enabled=yes"

单行代码将确保httpd服务正在运行,并设置为在启动时自动启动(后者是“启用”的含义)。就像我刚开始所说的那样,我通常每天都使用Ansible的临时模式。但是,当需要进行新的部署或升级时,就应该创建一个剧本,这是一个包含一堆Ansible命令的文本文件,当年。

剧本模式

我在上一篇文章中介绍了剧本。它们是YAML-(即另一种标记语言)格式的文本文件,其中包含Ansible要完成的事情的列表。例如,要在充满计算机的实验室中安装Apache,您将创建一个类似以下的文件:

---

- hosts: cadlab
  tasks:
  - name: install apache2 on CentOS
    yum: name=httpd state=latest
    notify: start httpd
    ignore_errors: yes

  - name: install apache2 on Ubuntu
    apt: update_cache=yes name=apache2 state=latest
    notify: start apache2
    ignore_errors: yes

  handlers:
  - name: start httpd
    service: name=httpd enable=yes state=started

  - name: start apache2
    service: name=apache2 enable=yes state=started

请注意,这不是最精美的剧本。它包含一个尝试将yum和apache2安装到apt的httpd的尝试。如果实验室是CentOS和Ubuntu计算机的混合体,则一种或另一种安装方法将失败。这就是为什么 ignore_errors命令包含在每个任务中的原因。否则,Ansible会在遇到错误时退出。同样,此方法有效,但效果不理想。创建条件语句以允许在不兼容的平台上正常退出会更好。实际上,更复杂,功能更多的剧本在Ansible中倾向于演变为“角色”。

的角色

角色并不是真正的操作模式。实际上,角色是剧本的组成部分。就像剧本可以具有任务,变量和处理程序一样,它们也可以具有角色。很简单,角色只是组织剧本中引用的各种组件的一种方式。它以文件夹布局开始:

roles/
  webserver/
    tasks/
      main.yml
    handlers/
      main.yml
    vars/
      main.yml
    templates/
      index.html.j2
      httpd.conf.j2
    files/
      ntp.conf

Ansible会在当前目录中以及系统范围内的某个位置(例如/ etc / ansible / roles)中查找角色文件夹,因此您可以存储角色以使角色井井有条并离开主文件夹。使用角色的好处是您的剧本看起来像这样简单:

---

- hosts: cadlab
  roles:
    - webserver

然后,“网络服务器”角色将被应用到“ cadlab”组,而无需在您的剧本中键入更多信息。指定角色后,Ansible将在您的角色文件夹(当前目录或系统范围的目录)中查找与名称“ webserver”匹配的文件夹。然后它将执行webserver / tasks / main.yml中的任务。该剧本中提到的所有处理程序都将在webserver / handlers / main.yml中自动搜索。同样,只要模板模块或文件/复制模块引用了文件,就无需指定路径。Ansible会自动在webserver / files /或/ webserver / templates /内部查找文件。

基本上,使用角色将为您节省很多路径声明和包含语句。这看起来很简单,但是组织创建了一个标准,不仅可以轻松确定角色的作用,还可以轻松地与他人共享您的代码。如果您始终知道任何文件都必须存储在role / rolename / files /中,则意味着您可以与其他人共享“角色”,他们将确切知道该怎么做,即将其放入自己的角色文件夹中并开始使用它。

共享角色:Ansible Galaxy

当前的DevOps工具(例如Chef,Puppet和Ansible)最好的方面之一是,有一群人愿意分享他们的辛勤工作。在较小的规模上,角色是与同事共享的好方法,尤其是当您具有专门针对您的环境定制的角色时。由于许多环境是相似的,因此可以与更多的受众共享角色,这就是Ansible Galaxy发挥作用的地方。

老实说,与Ansible一起吸引我的是命名约定中的科幻主题。我知道我在这方面有点傻,但是仅仅命名Ansible或Ansible Galaxy会引起我的注意。这可能是“书呆子为书呆子建造”之类的事情之一。我完全同意。如果您前往Galaxy网站,则会找到共享角色的在线存储库-而且还有很多。

只需下载和使用其他人的角色,您在Ansible Galaxy上不需要任何类型的帐户。您可以通过以下方法在网站上进行搜索:转到Galaxy,然后单击页面左侧的“浏览角色”(图1)。当前有13,000个角色上载到Ansible Galaxy,因此我强烈建议您利用搜索功能!在图2中,您将看到我已经搜索了“ apache”并按“ downloads”进行了排序,以便找到最受欢迎的角色。

Ansible,第四部分:将所有内容放在一起

图1.单击该链接以浏览和搜索角色。

Ansible,第四部分:将所有内容放在一起

图2. Jeff Geerling的角色始终值得一试。

您会发现许多非常流行的标准角色是由Jeff Geerling编写的,其用户名为geerlingguy。他是Ansible开发人员,他至少写了一本我已经读过的Ansible书,可能还写过其他书。他分享他的角色,我鼓励您检查一下这些角色-不仅是使用它们,而且是看他如何编码有关问题的代码,例如有条件地为给定的发行版选择正确的模块等等。您可以单击角色名称并查看所有涉及的代码。您可能会注意到,如果您想检查代码,则需要单击GitHub链接。这是Ansible Galaxy的天才之处之一,所有角色都存储在用户的GitHub页面上,而不是Ansible Galaxy服务器上。由于大多数开发人员将代码保存在GitHub上,因此他们不会

顺便说一句,如果您希望共享自己的Ansible角色,则需要使用GitHub用户名上载它们,因为同样,角色都存储在GitHub上。但这是领先的。首先,您需要学习如何在您的环境中使用角色。

使用ansible-galaxy安装角色

当然,可以下载整个存储库,然后将内容解压缩到您的角色文件夹中。由于它们只是文本文件和结构化文件夹,因此这样做确实没有任何错误。这比使用Ansible内置的工具方便得多。

Ansible命令行上有一个搜索机制来搜索Ansible Galaxy网站,但是为了找到我想使用的角色,我通常会去网站上找到它,然后使用命令行工具下载并安装它。这是Jeff Geerling的“ apache”角色的示例。为了使用Ansible下载角色,您需要执行以下操作:

sudo ansible-galaxy install geerlingguy.apache

注意两件事。首先,您需要以root特权执行此命令。这是因为该ansible-galaxy命令会将角色安装在系统范围内的Roles文件夹中,常规用户帐户无法将其写入(默认情况下)。其次,请注意Ansible Galaxy上命名的角色格式。格式为username.rolename,因此在本例中为geerlingguy.apache,这也是您引用剧本中角色的方式。

如果您想查看以正确格式列出的角色,可以使用 ansible-galaxy的搜索命令,但是就像我说的那样,我发现它没什么用处,因为它没有按受欢迎程度排序。实际上,我根本无法弄清楚它的排序方式。我唯一一次使用命令行搜索功能是,如果我也使用grep一个人来缩小角色范围。无论如何,图3显示了ansible-galaxy搜索结果 注意username.rolename格式。

Ansible,第四部分:将所有内容放在一起

图3.我喜欢命令行,但是这些搜索结果令人沮丧。

安装角色后,由于它已安装在系统级角色文件夹中,因此可以立即在您自己的剧本中使用。在我的情况下,这是/ etc / ansible / roles(图4)。所以现在,如果我创建这样的剧本:

---
- hosts: cadlab
  roles:
    - geerlingguy.apache

无论我使用的是什么发行版,Apache都将安装在我的所有cadlab计算机上。如果您想了解角色(只是一堆任务,处理程序等)的工作方式,只需浏览/etc/ansible/roles/geerlingguy.apache/中的文件夹结构。可以使用或修改。

Ansible,第四部分:将所有内容放在一起

图4. Easy Peasy,柠檬压榨

创建自己的角色

这里实际上没有任何魔术,因为您可以轻松地创建一个角色文件夹,然后在其中手动创建自己的角色,但是ansible-galaxy 通过为您创建骨架角色, 确实为您提供了捷径。确保您具有角色文件夹,然后键入:

ansible-galaxy init roles/rolename

最后,您将为新角色创建一个精心创建的文件夹结构。它没有任何神奇的功能,但是作为一个以前拼写错误“模板”的人,我可以告诉你,如果像我这样笨拙的手指,它将为您节省很多挫败感。

分享您的角色

如果您想在Ansible Galaxy上分享角色,这很容易做到。确保您在GitHub上有自己的角色(使用git不在本文的讨论范围内,但是无论如何,使用git和GitHub是跟踪代码的好方法)。在GitHub上拥有角色后,您可以使用ansible-galaxy将其“导入”到可公开搜索的Ansible Galaxy网站。您首先需要进行身份验证:

ansible-galaxy login

在尝试使用命令行工具登录之前,请确保您已访问Ansible Galaxy网站并使用GitHub帐户登录。您可以在图5中看到,起初我无法登录。然后我登录了网站,之后,我就能够成功使用命令行工具登录了。

Ansible,第四部分:将所有内容放在一起

图5.这让我发疯,试图弄清楚为什么我不能进行身份验证。

登录后,可以通过输入以下内容添加角色:

ansible-galaxy import githubusername githubreponame

该过程需要一段时间,因此您可以根据需要添加 -no-wait选项,并且角色将在后台导入。我真的不建议您这样做,除非您创建了值得共享的角色。请记住,Ansible Galaxy上有超过13,000个角色,因此发生了许多“重新发明轮子”的事件。

从这里?

好吧,这花了我四篇文章,但是我认为,如果您一直在关注,那么应该从这里开始学习。在Ansible中,人们通常将剧本和角色放在他们的注意力上,但是我也鼓励您利用即席模式来执行日常维护任务。在某些方面,Ansible只是另一个DevOps配置管理工具,但对我来说,它最像是我使用Bash脚本完成了数十年的传统问题解决方案。也许我只是喜欢Ansible,因为它与我的想法相同。无论您的动机如何,我都鼓励您学习足够的Ansible,以便您确定它是否适合您的工作流程以及它是否适合我的工作流程。

资源资源

这里是Shawn Powers的本系列前三篇文章的链接:


©著作权归作者所有:来自ZhiKuGroup博客作者没文化的原创作品,如需转载,请注明出处,否则将追究法律责任 来源:ZhiKuGroup博客,欢迎分享。

评论专区
  • 昵 称必填
  • 邮 箱选填
  • 网 址选填
◎已有 0 人评论
搜索
作者介绍
30天热门
×
×
本站会员尊享VIP特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×