ansible角色目录结构

测试技术在软件开发中起着重要的作用,当我们谈论基础架构即代码(IaC)时,这也没有什么不同。

在开发自动化时,典型的工作流程将从新的虚拟机开始。 我将使用Vagrant来说明这个想法,但是您可以使用libvirtDockerVirtualBoxVMware ,私有或公共云中的实例,或数据中心虚拟机管理程序中配置的虚拟机( oVirtXen或VMware,用于例)。

在决定使用哪个虚拟机时,请与实际目标环境平衡反馈速度和相似性。

Vagrant的最小起点是:

vagrant init centos/ 7 # or any other box 
vagrant init centos/ 7 # or any other box

Vagrantfile中

config.vm.provision "ansible" do |ansible|
     
     

  ansible.playbook = "playbook.yml"
     
     

end

最后,您的工作流程将是:

  1. vagrant up
  2. 编辑剧本。
  3. vagrant provision
  4. vagrant ssh以验证VM状态。
  5. 重复步骤2至4。

有时,应该销毁VM并再次启动它( vagrant destroy -f; vagrant up ),以提高您的剧本的可靠性(即,测试自动化是否能够端对端运行)。

尽管这是一个很好的工作流程,但是您仍在完成连接到VM并验证一切是否按预期工作的所有艰苦工作。

如果测试不是自动化的,您将面临与不自动化基础结构时类似的问题。

幸运的是,诸如TestinfraGoss之类的工具可以帮助自动进行这些验证。

我将重点介绍Testinfra,它是用Python编写的,并且是Molecule的默认验证程序。 这个想法很简单:使用Python自动执行验证:

def test_nginx_is_installed 
     
     ( host 
     
     ) :
     
     

    nginx 
     
     = host. 
     
     package 
     
     ( 
     
     "nginx" 
     
     ) 
     
     

    
     
     assert nginx. 
     
     is_installed 
     
     

    
     
     assert nginx. 
     
     version . 
     
     startswith 
     
     ( 
     
     "1.2" 
     
     ) 
     
     


def test_nginx_running_and_enabled 
     
     ( host 
     
     ) :
     
     

    nginx 
     
     = host. 
     
     service 
     
     ( 
     
     "nginx" 
     
     ) 
     
     

    
     
     assert nginx. 
     
     is_running 
     
     

    
     
     assert nginx. 
     
     is_enabled

在开发环境中,此脚本将使用SSH(就像Ansible一样)连接到目标主机,以执行上述验证(程序包存在/版本和服务状态):

py. test --connection = ssh --hosts = server 
py. test --connection = ssh --hosts = server

简而言之,在基础架构自动化开发过程中,面临的挑战是调配新的基础架构,针对新基础架构执行剧本,并验证您的更改是否反映了您在剧本中声明的状态。

  • Testinfra可以验证什么?
  • 从用户的角度来看,基础架构已启动并正在运行(例如,HTTPD或Nginx正在应答请求,而MariaDB或PostgreSQL正在处理SQL查询)。
  • 操作系统服务已启动并启用
  • 进程正在侦听特定端口
  • 一个过程正在回答请求
  • 配置文件已正确复制或从模板生成
  • 实际上,您为确保服务器状态正确所做的所有事情
  • 这些自动化测试提供什么安全性?
  • 在不破坏现有行为的情况下执行复杂的更改或引入新功能(例如,添加对基于Debian的系统的支持后,它仍可在基于RHEL的发行版中运行)。
  • 当发布新版本的Ansible并引入新的最佳实践时,重构/改进代码库。

到目前为止,我们对Vagrant,Ansible和Testinfra所做的工作很容易映射到“ 四阶段测试”模式中描述的步骤,这是一种使测试目标清晰的结构化方法。 它由以下几个阶段组成: 设置练习验证拆卸

  • 设置 :为测试执行准备环境(例如,启动新的虚拟机):
    vagrant up
  • 练习 :针对被测系统(即Ansible剧本)有效执行代码:
    vagrant provision
  • 验证 :验证上一步输出:
    py.test (使用Testinfra)
  • 拆解 :返回到设置之前的状态
    vagrant destroy

我们用于临时剧本的相同想法可以应用于角色开发和测试,但是每次开发新内容时,是否都需要执行所有这些步骤? 如果要使用容器或OpenStack而不是Vagrant,该怎么办? 如果您更喜欢使用Goss而不是Testinfra,该怎么办? 您如何在代码中的每个更改中连续运行此代码? 有没有更简单快捷的方法来通过自动化测试来开发我们的剧本和角色?

分子

分子帮助通过测试发展角色。 该工具甚至可以使用测试用例初始化一个新角色: molecule init role –role-name foo

Molecule足够灵活,可以让您使用不同的驱动程序进行基础架构配置,包括Docker,Vagrant,OpenStack,GCE,EC2和Azure。 它还允许使用不同的服务器验证工具,包括Testinfra和Goss。

它的命令简化了开发工作流程中常用的任务的执行:

  • lint -执行YAML -lint,ansible皮棉flake8,报告故障,如果有问题
  • syntax -验证角色是否出现语法错误
  • create -创建一个实例与配置的驱动程序
  • prepare -准备与提供配置剧本实例
  • converge -执行针对主机的剧本
  • idempotence -执行一次剧本两次,如果第二次运行发生更改,则失败(非幂等)
  • verify -执行服务器状态验证工具(testinfra或goss)
  • destroy -销毁实例
  • test -执行之前的所有步骤

login命令可用于连接到配置的服务器以进行故障排除。

一步步

您如何从根本没有测试,到每次更改/提交都执行一个不错的代码库?

1. virtualenv (可选)

virtualenv工具创建隔离的环境,而virtualenvwrapper是方便使用分机的集合virtualenv

这些工具可防止机器中的Molecule与其他Python软件包之间的依赖关系和冲突。

sudo pip 
     
     install virtualenvwrapper
     
     
export 
     
     WORKON_HOME =~ 
     
     / envs
     
     
source 
     
     / usr 
     
     / local 
     
     / bin 
     
     / virtualenvwrapper.sh
     
     

mkvirtualenv mocule

2.分子

使用Docker驱动程序安装Molecule:

pip install molecule ansible docker 
pip install molecule ansible docker

在测试场景中生成新角色:

molecule init role -r role_name 
molecule init role -r role_name

或对于现有角色:

molecule init scenario -r my-role 
molecule init scenario -r my-role

所有必需的配置都是通过您的角色生成的,您只需要使用Testinfra编写测试用例:

import 
     
     os 
     
     

import testinfra. 
     
     utils . 
     
     ansible_runner 
     
     


testinfra_hosts 
     
     = testinfra. 
     
     utils . 
     
     ansible_runner . 
     
     AnsibleRunner 
     
     ( 
     
     

    
     
     os . 
     
     environ 
     
     [ 
     
     'MOLECULE_INVENTORY_FILE' 
     
     ] 
     
     ) . 
     
     get_hosts 
     
     ( 
     
     'all' 
     
     ) 
     
     


def test_jboss_running_and_enabled 
     
     ( host 
     
     ) :
     
     

    jboss 
     
     = host. 
     
     service 
     
     ( 
     
     'wildfly' 
     
     ) 
     
     


    
     
     assert jboss. 
     
     is_enabled 
     
     


def test_jboss_listening_http 
     
     ( host 
     
     ) :
     
     

    
     
     socket 
     
     = host. 
     
     socket 
     
     ( 
     
     'tcp://0.0.0.0:8080' 
     
     ) 
     
     


    
     
     assert 
     
     socket . 
     
     is_listening 
     
     


def test_mgmt_user_authentication 
     
     ( host 
     
     ) :
     
     

    command 
     
     = 
     
     """curl --digest -L -D - http://localhost:9990/management \ 

                -u ansible:ansible""" 
     
     


    
     
     cmd 
     
     = host. 
     
     run 
     
     ( command 
     
     ) 
     
     


    
     
     assert 
     
     'HTTP/1.1 200 OK' 
     
     in 
     
     cmd . 
     
     stdout

此Wildfly角色的测试案例示例验证了OS服务已启用,进程正在端口8080进行侦听以及身份验证已正确配置。

对这些测试进行编码很简单,您基本上需要考虑一种自动验证方式。

当您登录到剧本所针对的机器时,或者为监视/警报系统构建验证时,您已经在编写测试。 这些知识将有助于使用Testinfra API或使用系统命令来构建某些内容。

CI

连续执行分子测试非常简单。 上面的示例适用于具有Docker驱动程序的TravisCI,但可以轻松地应用于Molecule支持的任何CI服务器和任何基础结构驱动程序。

--- 
     
     

sudo 
     
     :  required 
     
     

language 
     
     :  python 
     
     

services 
     
     :
  - docker 
     
     

before_install 
     
     :
  - sudo apt-get -qq update
     
     

  - pip install molecule
     
     

  - pip install docker 
     
     

script 
     
     :
  - molecule test

访问Travis CI以获取示例输出。

ansible角色目录结构