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

以上

广告
将在 10 秒后关闭
bannerAds