Ansible中的单元测试是确保角色按预期运行的关键。通过允许您指定针对不同环境测试角色的方案,Molecule使此过程更容易。使用Ansible,Molecule将角色卸载到配置器,该配置器在配置的环境中部署角色并调用验证器(例如Testinfra)来检查配置偏差。这可确保您的角色在该特定方案中对环境进行了所有预期的更改。
在本指南中,您将构建一个Ansible角色,将Apache部署到主机并在CentOS 7上配置firewalld。要测试此角色是否按预期工作,您将使用Docker作为驱动程序和Testinfra(一个Python库)在Molecule中创建一个测试用于测试服务器的状态。 Molecule将提供Docker容器来测试角色,Testinfra将验证服务器是否已按预期配置。完成后,您将能够跨环境为构建创建多个测试用例,并使用Molecule运行这些测试。
先决条件
在开始本指南之前,您需要以下内容:
一个Ubuntu 18.04服务器。按照初始服务器设置中的步骤使用Ubuntu 18.04指南创建非root sudo用户,并确保无需密码即可连接到服务器。
Docker安装在您的服务器上。按照如何在Ubuntu 18.04上安装和使用Docker中的步骤1和2,包括将非root用户添加到docker组。
在服务器上安装并配置了Python 3和venv。请遵循如何在Ubuntu 18.04服务器上安装Python 3和设置编程环境以获得指导。
熟悉Ansible剧本。有关查看,请参阅配置管理101:编写Ansible Playbooks。
第1步 – 准备环境
如果您已遵循先决条件,则应安装并正确配置Python 3,venv和Docker。让我们首先创建一个虚拟环境来测试Ansible with Molecule。
首先以非root用户身份登录并创建新的虚拟环境:
python3 -m venv my_env
激活它以确保您的操作仅限于该环境:
来源my_env / bin / activate
接下来,在激活的环境中,安装wheel包,它提供了pip用于安装Ansible的bdist_wheel setuptools扩展:
python3 -m pip安装轮
你现在可以用pip安装分子和docker。 Ansible将自动安装为Molecule的依赖项:
python3 -m pip安装分子码头
以下是每个包的功能:
分子:这是您将用于测试角色的主要Molecule包。安装分子会自动安装Ansible以及其他依赖项,并允许使用Ansible playbooks来执行角色和测试。
docker:Molecule使用此Python库与Docker进行交互。您将需要这个,因为您使用Docker作为驱动程序。
接下来,让我们在Molecule中创建一个角色。
第2步 – 在分子中创建角色
设置好您的环境后,您可以使用Molecule创建一个基本角色,用于测试Apache的安装。此角色将创建目录结构和一些初始测试,并将Docker指定为驱动程序,以便Molecule使用Docker运行其测试。
创建一个名为ansible-apache的新角色:
分子初始化角色-r ansible-apache -d docker
-r标志指定角色的名称,而-d指定驱动程序,驱动程序为Molecule提供主机以供测试。
切换到新创建的角色的目录:
cd ansible-apache
测试默认角色以检查Molecule是否已正确设置:
分子测试
您将看到列出每个默认测试操作的输出。在开始测试之前,Molecule验证配置文件molecule.yml以确保一切正常。它还会打印此测试矩阵,该矩阵指定测试操作的顺序:
产量
– >验证模式/home/sammy/ansible-apache/molecule/default/molecule.yml。
验证成功完成。
– >测试矩阵
└──默认
├──棉绒
├──破坏
├──依赖
├──语法
├──创造
├──准备
├──收敛
├──幂等
├──side_effect
├──验证
└──破坏
…
在您创建角色并自定义测试后,我们将详细讨论每个测试操作。现在,请注意每个测试的PLAY_RECAP,并确保没有任何默认操作返回失败状态。例如,默认“创建”操作的PLAY_RECAP应如下所示:
产量
…
回放************************************************* *********************
localhost:ok = 5 changed = 4 unreachable = 0 failed = 0
让我们继续修改角色以配置Apache和firewalld。
第3步 – 配置Apache和Firewalld
要配置Apache和firewalld,您将为角色创建任务文件,指定要安装的软件包和要启用的服务。这些详细信息将从您将用于替换默认Apache索引页的变量文件和模板中提取。
仍然在ansible-apache目录中,使用nano或您喜欢的文本编辑器为角色创建任务文件:
nano tasks / main.yml
您将看到该文件已存在。删除那里的内容并用以下代码替换它以安装所需的包并启用正确的服务,HTML默认值和防火墙设置:
〜/ ansible的Apache /任务/ main.yml
—
– 名称:“确保所需的包裹存在”
百胜:
名称:“{{pkg_list}}”
州:现在
– 名称:“确保最新的index.html存在”
模板:
src:index.html.j2
dest:/var/www/html/index.html
– 名称:“确保启动并启用httpd服务”
服务:
名称:“{{item}}”
州:开始了
启用:true
with_items:“{{svc_list}}”
– 名称:“firewalld中的白名单http”
firewalld:
服务:http
state:启用
永久:真实
立即:是的
这本剧本包括4个任务:
“确保存在所需的包”:此任务将安装pkg_list下的变量文件中列出的包。变量文件将位于〜/ ansible-apache / vars / main.yml,您将在此步骤结束时创建它。
“确保最新的index.html存在”:此任务将复制模板页面index.html.j2,并将其粘贴到Apache生成的默认索引文件/var/www/html/index.html上。您还将在此步骤中创建新模板。
“确保启动并启用httpd服务”:此任务将启动并启用变量文件中svc_list中列出的服务。
“firewalld中的白名单http”:此任务将在firewalld中将http服务列入白名单。 Firewalld是一个完整的防火墙解决方案,默认存在于CentOS服务器上。要使http服务正常工作,您需要公开所需的端口。指示firewalld将服务列入白名单可确保将服务所需的所有端口列入白名单。
完成后保存并关闭文件。
接下来,让我们为index.html.j2模板页面创建一个模板目录:
mkdir模板
创建页面本身:
纳米模板/ index.html.j2
粘贴以下样板代码:
〜/ ansible的Apache /模板/ index.html.j2