有效开发和维护Ansible角色

Ansible是解决各种自动化任务(包括配置,备份和部署项目)的系统。 使用该系统从简单的环境到大型项目编写自动化脚本是令人愉快的。 在脚本中,剧本扮演重要角色,结构化剧本扮演角色。

Ansible不是神奇药丸 ,只是起初有帮助。 当项目发展时,很难维持更多的角色。 角色的连续交付机制有助于解决问题。

对此, 俄罗斯DevOps Conf上Alexander Kharkevich的报告进行了解码。 在报告中:通过CI开发Ansible角色,这是一种开发公共角色和在私有基础结构中运行测试的公共角色的机制。 报告中没有结论。



演讲者简介EPAM Systems的高级系统工程师Alexander Kharkevich( kharkevich )。

让我们从快速概述开始。

关于Ansible


Ansible是一个配置管理系统。 它是用Junja模板化的Python语言编写的,YAML用作DSL。 通过Ansible Tower-WebUI进行管理和监视系统性能。

在3年红帽收购了整个项目之后,Ansible出现在2012年,两年后又推出了AWX-Ansible Tower的项目开源版本。

安装方式


要使用Ansible,您需要做两个简单的事情。

在第一个阶段,在静态基础结构的情况下编译清单文件。



第二步是编写一本Playbook,将系统置于预期状态。



通常,我们对自动化的编写有着不可抗拒的渴望,可以再次重用。 自动化是一个很好的愿望,Ansible的员工提出了一个很酷的概念-角色。

角色角色


这是一个结构化的实体,它将使系统达到预期的状态并具有重用自动化的能力。



例如,我们可以为Oracle Java编写一个角色:获取一个Playbook,放置一个角色,并将其应用于目标系统。 输出将安装Java。



我们如何想象与角色一起工作


由于Ansible具有出色的角色,因此我们认为现在我们将在各种场合使用并编写许多角色,四处闲逛并重复使用以减少工作量。


我们以为我们会写出漂亮又聪明的角色...



但是生活却变得更加复杂。

事实证明,实际上


当有多个人从事某个角色的写作或改进时,每个人都会在一个地方写作,并且会出现令人不愉快的惊奇:该角色的行为与作者最初的意图不同。

将其应用到最后是很好的,但这并不总是会发生。 有时,角色可以成功执行,但是在目标系统上,这根本不影响最初想要的角色。


结果,出现了可怕的结构,试图将bash转移到Ansible并在配置管理工具下提交所有这些信息。 我们遇到了这种现象,感到很难过。



通过思考,我们发现配置管理中存在某种代码,这意味着适用于系统开发生命周期中代码管理的实践也适用于Ansible。

  • 收集最佳做法。
  • 应用静态分析,皮棉。
  • 要测试。
  • 要超频,请进入发布管理。

我们决定在家中实施该做法,并立即去寻找合适的工具。

工具


从版本控制系统和持续集成的角度来看,有数十种可用的解决方案以及一个分支测试动物园。



从Ansible中的版本管理的角度来看,解决方案并不多:在Git中进行标记,或在Git中进行标记并上传到Galaxy。

有许多测试工具的方法,每种方法都可以使用他们喜欢的工具。 使用KitchenCI,InSpec和Serverspec的流行解决方案。

我们的灵魂不是撒谎用Python编写Ansible,而是将Ruby世界中的工具混合在一起。 因此,抛弃了Python世界以外的所有东西,我们得到了以下图片。



我们使用:

  • 用于配置管理-GitHub和GitLab。 GitLab正在GitHub上直接观看。 为什么这样做,我稍后再讲。
  • 对于CI,我们将Travis用作公开部分,将GitLab Runner用作私有部分。
  • 测试分子。
  • 启动到GitHub并添加到Ansible Galaxy。

使用这些工具的开发周期变得更加有趣。


分子


该工具有助于全面测试该角色。 为此,他拥有一切:

  • 与YAML绒棉和Ansible绒棉集成,以检查角色是否符合我们的要求。
  • 测试用于运行功能测试的基础结构。
  • 分子驱动程序是分子部署我们的测试平台的地方。 支持所有功能:Azure,委派,Docker,EC2,GCE,LXC,LXD,Openstack,Vagrant。
  • 还有一件有用且简单的事情-委托。 这意味着Molecule不负责部署测试平台,开发人员必须编写一本Playbook来提高测试平台。 如果您拥有超级私有云,则委托创建和删除测试机器,而Molecule本身将在其中添加所有内容。



测试矩阵


分步考虑测试矩阵。 总共有11个步骤,但我会简要介绍一下。

1.棉绒


他们运行YAML皮棉和Ansible皮棉,然后找到了东西。



在上面的示例中,棉绒发誓,不仅应在Ansible中调用该外壳,还应将其固定并绑定到某些东西。

2号。销毁


分子摆脱了先前测试后残留的一切。

有时跑步已经过去,训练场已经展开,测试已经完成。 支架的末端应清洁,但是不可抗力介入了,没有进行清洁。 在这种情况下,分子会破坏并清除残留的环境。



No. 3.依赖


我们获取requirements.yml文件,并添加我们角色对其他角色的依赖关系。 例如,提到以下事实:如果没有在系统上安装Java,该角色将不会生效:

--- - src: lean_delivery.java version: 1.4 

Molecule理解这一点并将执行脚本:

  • 去银河或Git
  • 将意识到解决依赖关系是必要的;
  • 再次进入银河;
  • 下载;
  • 将扩大。



No. 4.语法


下一步是语法检查。 但不是您的角色,而是您添加到Molecule的测试Playbook。 此步骤中也存在语法错误。

幻灯片显示ansible角色称为“ kibana”,而在测试手册中,其称为ansible-role-kibana。 系统会说:“一切都很好,您可以在这里创建它,但是我不会这样做,因为名称不匹配!”



5号。创建


在此阶段,我们指示用于部署测试站点的驱动程序。 指向Google-它将在Google Cloud中增加测试机器。

我们可以在molecular.yml文件中写入所需的内容。 让我们看看它在Docker示例中的外观。



  • 我指定要拉起的docker映像。
  • 我指出了如何将它们分组以便形成清单文件。

我想拥有两个docker映像:一个用于RHEL类,第二个用于Debian类,以确保在测试运行期间,RHEL和Debian都可以正常使用。

6号。准备


这是测试执行环境的初步准备步骤。

似乎一切都已增加,但有时您需要执行一些其他设置。 如果要在Debian或Ubuntu中在提升的Docker中进行测试,则需要安装第二个Python,这种情况经常发生。

7号汇合


为确保实例到达末尾,实例中角色的第一次大型运行阶段已运行,Ansible确认一切正常。



  • 分子是指Ansible。
  • Ansible部署到测试站点。
  • 它运行。
  • 一切都很好!

No. 8等幂


幂等性测试很简单,看起来像这样。



  • 角色第一次执行上一步。
  • Ansible报告已进行了多少更改。
  • 重新启动相同的角色。
  • 检查系统是否已进入预期状态,但是第二次租用时没有更改。

结果,我们知道我们的角色不会造成破坏性的作用。

这个阶段给与我一起工作的人带来了痛苦。 他们试图变通以击败幂等性测试。 分子可以控制它经历的各个阶段,而他们所做的第一件事就是关闭幂等性检查。



我们遇到了停电并为此击败了我们,但是工程师很聪明,而且更深入。 开发人员决定说Ansible中的这一步骤不会更改任何内容。

尽管实际上会有某种团队出现在这里。 Ansible将直接服用
将覆盖文件,但同时所有内容看起来都是幂等的。



当还抓住了这个技巧时,图片开始看起来像这样。



很好-该脚本以默认名称运行,并且是幂等的。

9号。副作用


在下一阶段,副作用被叠加。 不必这样做,但是当您测试相互依赖的复杂传播角色时很方便。

例如,先提升ELK堆栈,然后提升集群中的Elasticsearch。 在side_effect阶段,添加测试数据并从集群中删除几个节点。 测试站点已准备好进行下一步的功能测试。

10号。验证


测试基础架构。



上面是一个非常简单的测试示例。 如果安装了Ubuntu,则我们检查是否已安装Docker Community Edition软件包,它具有正确的版本,并且该服务正在运行。

在功能测试的启动阶段,一切都可能变得非常复杂。

最好的例子可能是ELK堆栈,如果我们在一些Elasticsearch请求中请求一些测试数据,并且由于我们知道测试数据,它将回答我们。 我们不会验证所有已安装的组件是否都已组装完毕,但是会看到Elasticsearch已启动,正在运行,并且可以准确显示您在搜索中所需的内容。



运行功能测试时,它看起来很漂亮,在整个清单中都在运行,而系统告诉我们一切都很好。 同样,如果我们编写测试,则测试将运行。

11号。销毁


我们进行了测试,有某种形式的测试报告,现在我们删除了后面的所有垃圾。

自动化技术


分子是一个很棒的工具。 现在,最简单的事情仍然是-将持续集成系统连接到该系统,以便享受我们对角色的自动测试。



与其他地方一样,有几个功能。

我们为使某些事情自动化而编写的某些角色很好,但是我们不能使用Travis来测试系统,因为角色会部署由于许可原因而无法共享的产品。

例如,您有一个Oracle数据库的自动部署。 如果将安装程序安装在文件中,则该公司的律师会来找您并且会发誓。 为了使每个人都能安居乐业,并且不发誓,我们决定采取以下措施。

  • GitLab在其最新版本中,了解了如何为第三方存储库执行CI。
  • 该角色位于公共GitHub上,该公共GitHub连接到该公共GitHub,我们在其中表示:“亲爱的GitLab,请为我们收集外部存储库的CI”。
  • 私人跑步者在封闭的区域内被拴在GitLab上,他们已经可以使用二进制文件了,可以部署它们。

实际上,角色是公开的,数据也是公开的,我们绝不欺骗任何人-我们使用真实的工具运行真实的测试。

让我们看一下Travis中的外观步骤。

特拉维斯




步骤如下:

  • 在第8行的第一步,我们告诉Travis,我们不仅要启动它,而且还使用Docker服务,以便在Travis中可以使用Docker。
  • 接下来,在第10行,我们采用皮棉规则。 我们不仅使用默认的Ansible lint规则,而且还编写了自己的规则。
  • 在第15行,我们首先调用lint,以节省运行测试矩阵的时间。 如果某些内容不是按照规则编写的,并且皮棉没有找到它,那么它会从头开始并留下报告。 提交,修复其提交或放弃更改的开发人员。 维修后,请放手,我们将继续进行测试。

公众CI


公共CI看起来很基础。



从GitHub到Travis的箭头,其中有Molecule和Docker。

私人CI


对于GitLab的私有部分,一切都是相同的。



在私人区域中,我们奔跑着,照片看起来更加有趣。



该代码从GitHub到达GitLab,在该地方运行了一个私人跑步者,可以拉动外部服务,例如,在Amazon上运行某些东西。

有点题外话。 不想在Amazon上启动和部署测试环境,因为您需要密钥。 提出将其公开发布的机制,但同时又不要成为下一个采矿的启动平台-这是一项艰巨的任务。 因此,我们没有解决问题,而是私下采取了亚军措施,以免开采亚马逊比特币。

即使在这里,我们还是有些懒惰,并做了以下工作。 我们在EPAM拥有自己的私有云,并且它是混合的。 这意味着可以从内部云(如区域)访问许多公共云。 您不能编写一千个测试,但要在各个区域中闲逛并说:“现在根据此测试场景对AWS,EPAM Cloud,Azure区域进行测试。”

Ansible星系


我们来到了结局,我们的角色是绿色,美丽,我们将在银河中发布它。



这是一个简单的操作:

  • Travis中的webhook调用。
  • 在这种情况下,Travis将触发,CI将再次运行。
  • 打电话给webhook。
  • 新版本将在Galaxy中成功增长。

有一个功能-如果您不标记角色,不标记,不为其分配版本,则在Galaxy中它将始终没有版本。 一旦另一个开发人员想要通过Ansible Galaxy安装程序自己安装它,他将取消master分支或默认情况下另一个分支中的角色。 默认情况下,分支并不总是稳定的,这很不方便。

如果您在Galaxy上发布内容,请不要忘记对其进行标记,以确保有版本,一切都很棒。

模式


我分享了一个小技巧:为了避免每次编写新角色时都进行复制粘贴,我们决定创建模板和单独的存储库,并在其中放置模板,以便快速从头开始编写角色。

该模板具有Ansible lint和GitHub issue_template的默认设置。 一切都在公共领域,因此,以精美的形式发出issue_template对我们发出拉取请求或错误报告也很有吸引力。 我们将Gitignore,Gitlab-ci的模板和许可证添加到同一存储库。



默认情况下,我们以Apache 2.0许可证发布。 如果您想来找我们并重复使用模板,则可以删除所有内容,创建一个封闭的存储库,而不向任何人解释任何内容。 谢谢Apache。

我们有几个测试选项,使您可以快速启动并开始一切。

总结


不会有任何结论,而是有指向我的GitHub ,我的Galaxy个人资料GitHub精益交付Ansible Galaxy的链接 。 使用链接,您可以查看一切工作原理。 所有示例均可免费获得。

下一次DevOps会议将于5月举行。

在等待活动期间,请订阅YouTube频道新闻通讯 。 该频道将补充最佳报告的记录,并且在邮件列表中,将提供有用的材料,成绩单和DevOps新闻的选择。

订阅,这将很有趣:)

Source: https://habr.com/ru/post/zh-CN431542/


All Articles