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 Kitcheninspec


奇奇


厨房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/hostsvm-oracle x2)
  3. oracle侦听器侦听IPv4。
  4. oracle侦听器解析vm-oracle域名 &取得IPv6。
  5. 失败

vm-oracle情况下会发生什么


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

OOM来拜访我们


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


解决方案:增加内存量。


建造缓慢


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


解决方案:


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

结论


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


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

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


参考文献


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


All Articles