Ansible和测试 第2部分
Ansible与测试 – 添加东京Ansible Meetup的LT演讲。
在这个演讲中,我介绍了用于组合使用Ansible和Serverspec的Ruby宝石。然而,我也考虑到Ansible有诸如Assert等测试模块,所以或许可以不使用Serverspec来进行测试。
在这篇文章中,我会谈谈使用Assert编写测试的感受和注意事项。
总结一下,与其仅使用Ansible进行构建和测试,还不如结合测试工具(如serverspec、envassert)一起使用更好。
[前提] Ansible的理念与测试
Ansible通过声明所需的状态(desired-state),来配置服务器。
例如,不是编写在操作系统启动时启动某个服务的步骤,而是声明(YAML格式),在操作系统启动时该服务应该处于启动状态,然后它将被相应地配置。
这个声明的思想在模块中也有体现,在service模块中,我们描述的状态不是state=start,而是state=started。
tasks:
- service: name=foo state=started enabled=yes
另外,Ansible以“快速失败”(fail-fast)著称,它会在playbook执行过程中立即失败(即无法达到声明的状态),因此您可以立即意识到失败。
这样一来,您无需再次执行测试来确认是否按预期构建。
在Ansible中,我们认为不需要再进行测试,因为它能按照声明的方式进行构建。
用Assert来编写测试。
我对我的Ansible样本TDD的Nginx部分写了测试。
Serverspec版本有19行,Ansible版本有26行。
- shell: rpm -qi nginx
register: p_installed
- shell: chkconfig --list | grep nginx
register: p_enabled
- shell: ps aux | grep nginx
register: p_running
- shell: netstat -ant | grep 80
register: p_listen
- stat: path=/etc/nginx/nginx.conf
register: p_exist
- shell: cat /etc/nginx/nginx.conf
register: p_cat
- assert:
that:
- p_installed is defined
- p_enabled is defined
- p_running is defined
- p_listen is defined
- p_exist.stat.exists
- "'worker_connections 1024;' in p_cat.stdout"
印象
在6个测试中,行数没有太大变化,但因为需要将变量存储在register中,所以写起来很麻烦。
在官方的示例中,它与stat结合在一起,但仅使用stat功能远远不够,所以我使用了shell模块。
必须使用shell时,感觉有些微妙。。
由于 Ansible 采用了声明式的思想,我认为未来测试也会得到完善。
个人而言,受到 Ruby 的影响,我将继续使用 serverspec。
考试注意事项之一是stat模块。
我认为 stat 中应该有 isdir,但实际上没有。这真让人惊讶。
需要注意 stat。
根据 stat 模块的源代码,可以执行以下操作。
'exists','mode','isdir','ischr','isblk','isreg','isfifo','islnk','issock','uid','gid','size','inode','dev','nlink','atime','mtime','ctime','wusr','rusr','xusr','wgrp','rgrp','xgrp','woth','roth','xoth','isuid','isgid'
考试注意事项2 只进行考试
只需要使用 include 和标记来读取用于测试的文件,就可以只进行测试。
- include: test.yml
tags: test
ansible-playbook site.yml -i hosts -t test
以上