
这是圣彼得堡Linux用户组的性能 2018-04-25的文本版本。 此处的示例代码: https : //github.com/ultral/ansible-role-testing
我相信您正在使用配置管理,而不是bash 。 即 您的配置是代码。 如果我们说基础架构就是代码,那么应该将其构想与软件开发一样应用到其构想中。 你有想过吗 你如何做? 还有其他?
先决条件
在描述的情况下,有很多介绍性的内容:
- 许多角色。
- Hyper-V作为主要的管理程序。
- 具有用于动态创建虚拟机的功能有限的私有云。
- 用于访问Internet的代理。
- 由于角色是整个VM的配置,包括网络设置,因此无法在docker中运行对Ansible角色的测试。
- 希望将绿色向导策略用于具有Ansible角色的存储库。
在做我们做的事情之前,我们先比较现有的解决方案。
专案 | 测试厨房 | 分子 | 自己的 |
---|
语言能力 | 红宝石 | 蟒蛇 | 重击/红宝石 |
观察者 | 132 | 126 | 0 |
星星 | 1413 | 1154 | 1个 |
前叉 | 502 | 174 | 2 |
执照 | 阿帕奇2.0 | 麻省理工学院 | 任何 |
提交 | 1929年 | 1264 | 0 |
发布 | 101 | 121 | 0 |
贡献者 | 109 | 82 | 5 |
我们决定不重新发明轮子 ,而是采用交钥匙解决方案。 我们的基础架构团队了解红宝石,因此选择了Test Kitchen & inspec
奇奇

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

但是我们决定继续前进。 使用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
知道发生了什么吗?
这是一个有趣的场景:
- 我们仅在oracle侦听器设置中启用了IPv4绑定。
- oracle使用FQDN。
- linux包含用于解析域名的特殊基础“ myhostname”,它在/ etc / hosts和dns服务器之后使用。
- Vagrant创建VM和更新
/etc/hosts
。
我会解释一下:
如果使用vm-oracle会发生什么?
- 流浪汉创建虚拟机。
- 流浪者更新
/etc/hosts
( vm-oracle x2) - oracle侦听器侦听IPv4。
- oracle侦听器解析vm-oracle域名。 &取得IPv6。
- 失败
在vm-oracle情况下会发生什么。 ?
- 流浪汉创建虚拟机。
- 流浪更新/ etc / hosts( vm-oracle & vm-oracle。 )。
- oracle侦听器侦听IPv4。
- oracle侦听器解析vm-oracle域名。 并获取IPv4
- 好啦
OOM来拜访我们
OOM随机杀死虚拟机。 同时,Testkitchen在他的日志中发出了各种奇怪的消息。
解决方案:增加内存量。
建造缓慢
整个计划运行缓慢,持续数十分钟,有时超过一个小时。
解决方案:
- 打包机 。 预组装虚拟机映像。
- 并行运行多个测试用例
结论
如果我们说基础设施就是代码,那么应该将其创建原理与软件开发一样。 一方面,我们得到了一个可行的解决方案,但仍有一些不愉快的时刻:
- 不友好,这一切看起来。
- 红宝石和蟒蛇的混合物。
- 没有检查和角色角色。
- 它工作缓慢。
- 困难..
在输出中,带有docker的分子看起来更有趣且更自然。 我们正在考虑。
参考文献