YML程序员是否梦想过可以进行测试?

厨房ci模式


这是圣彼得堡Linux用户组的性能 2018-04-25的文本版本。 此处的示例代码: https : //github.com/ultral/ansible-role-testing


我相信您正在使用配置管理,而不是bash 。 即 您的配置是代码。 如果我们说基础架构就是代码,那么应该将其构想与软件开发一样应用到其构想中。 你有想过吗 你如何做? 还有其他?


先决条件


在描述的情况下,有很多介绍性的内容:


  • 许多角色。
  • Hyper-V作为主要的管理程序。
  • 具有用于动态创建虚拟机的功能有限的私有云。
  • 用于访问Internet的代理。
  • 由于角色是整个VM的配置,包括网络设置,因此无法在docker中运行对Ansible角色的测试。
  • 希望将绿色向导策略用于具有Ansible角色的存储库。

在做我们做的事情之前,我们先比较现有的解决方案。


专案测试厨房分子自己的
语言能力红宝石蟒蛇重击/红宝石
观察者1321260
星星141311541个
前叉5021742
执照阿帕奇2.0麻省理工学院任何
提交1929年12640
发布1011210
贡献者109825

名称测试信息服务器规格检查高斯
Github菲尔普/ TestinfraMizzy / serverspec厨师/检查阿尔萨比/高斯
语言能力蟒蛇红宝石红宝石去
观察者9314516567
星星997210511672170
前叉138361330156
执照阿帕奇2.0麻省理工学院阿帕奇2.0阿帕奇2.0
提交3801854年4609309
发布3528234647
贡献者4311015931

我们决定不重新发明轮子 ,而是采用交钥匙解决方案。 我们的基础架构团队了解红宝石,因此选择了Test Kitchen & inspec


奇奇


厨房ci模式


这个想法很简单。 我们创建一个新的虚拟机,使用该角色,运行冒烟测试。


绿色建筑政策


绿色建筑政策纲要


但是我们决定继续前进。 使用ala github flow,即 在个人早午餐中的角色以及大师对merjim的评论后。 如果测试还可以,那么我们将角色滚动到基础架构上。


嵌套虚拟化


您还记得,我们在创建虚拟机方面受到限制,因此我们不得不以嵌套虚拟化的形式做出令人不愉快的决定。


我们需要更深入


最初,我们尝试Virtualbox x32不包括嵌套支持。 由于内核恐慌的稳定性,这并不是什么好主意。 第二个重要因素是我们坐在x86_64上,因此继续进行研究(hi libvirt),但最终选择了virtualbox,因为它在受支持的OS上更为常见。


难点


在发布期间,一切都很好。


从主机跳过访客设置到访客访客


在某些测试方案中,使用了代理设置,而在带有testkitchen的主机上使用了透明代理,并且ansible红利不接受带有空值的额外变量。


解决方案:老旧-创建ERB模板。


<%= ENV['http_proxy'].to_s.empty? ? 'http://proxy.example.com:3128' : ENV['http_proxy'] %> 

通过Ansible进行网络设置管理


在某些角色中,网络已配置,在测试中看起来像这样:


  • 我们通过复制文件来配置网络。
  • 应用网络设置。
  • 一切都不好。

解决方案:将接口添加到虚拟机


如果测试集包含“ _”,则所有内容均落入


Virtualbox不能在虚拟机名称中使用“ _”。 虚拟机使用了脚本的名称。


解决方案:重命名测试集“ vm_” =>“ vm-”


安装不带“。”的Oracle的测试用例。 虚拟机名称末尾掉落


当他们决定通过测试覆盖该角色时,该角色已用于有条件的销售中。 当您将其滚动到准备好的虚拟机中时,它就可以完成任务,它属于testkitchen。


小提示


 [root@vm-oracle vagrant]# getent ahosts vm-oracle 127.0.0.1 STREAM vm-oracle 127.0.0.1 DGRAM 127.0.0.1 RAW [root@vm-oracle vagrant]# getent ahosts vm-oracle. fe80::a00:27ff:febd:bd6a STREAM vm-oracle fe80::a00:27ff:febd:bd6a DGRAM fe80::a00:27ff:febd:bd6a RAW 10.0.2.15 STREAM 10.0.2.15 DGRAM 10.0.2.15 RAW [root@oracle vagrant]# getent ahosts oracle.example.com. 192.168.128.182 STREAM oracle.example.local 192.168.128.182 DGRAM 192.168.128.182 RAW 

知道发生了什么吗?


这是一个有趣的场景:


  1. 我们仅在oracle侦听器设置中启用了IPv4绑定。
  2. oracle使用FQDN。
  3. linux包含用于解析域名的特殊基础“ myhostname”,它在/ etc / hosts和dns服务器之后使用。
  4. Vagrant创建VM和更新/etc/hosts 。

我会解释一下:
如果使用vm-oracle会发生什么?


  1. 流浪汉创建虚拟机。
  2. 流浪者更新/etc/hosts ( vm-oracle x2)
  3. oracle侦听器侦听IPv4。
  4. oracle侦听器解析vm-oracle域名。 &取得IPv6。
  5. 失败

在vm-oracle情况下会发生什么。 ?


  1. 流浪汉创建虚拟机。
  2. 流浪更新/ etc / hosts( vm-oracle & vm-oracle。 )。
  3. oracle侦听器侦听IPv4。
  4. oracle侦听器解析vm-oracle域名。 并获取IPv4
  5. 好啦

OOM来拜访我们


OOM随机杀死虚拟机。 同时,Testkitchen在他的日志中发出了各种奇怪的消息。


解决方案:增加内存量。


建造缓慢


整个计划运行缓慢,持续数十分钟,有时超过一个小时。


解决方案:


  • 打包机 。 预组装虚拟机映像。
  • 并行运行多个测试用例

结论


如果我们说基础设施就是代码,那么应该将其创建原理与软件开发一样。 一方面,我们得到了一个可行的解决方案,但仍有一些不愉快的时刻:


  • 不友好,这一切看起来。
  • 红宝石和蟒蛇的混合物。
  • 没有检查和角色角色。
  • 它工作缓慢。
  • 困难..

在输出中,带有docker的分子看起来更有趣且更自然。 我们正在考虑。


参考文献


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


All Articles