帮助中心
如何用Molecule和Docker测试Ansible角色



Ansible Molecule是一个工具,用于测试和验证Ansible角色和多场景下的playbook。它有助于自动测试Ansible代码,并确保其在应用于目标服务器时能够按预期工作。使用Molecule,你可以在不同的环境和平台上测试角色和玩法。支持不同的虚拟化和容器化技术,如Docker、Podman、Vagrant,以及云供应商,如Amazon Web Services、Microsoft Azure和Google Cloud Platform。

Ansible Molecule是一个强大的工具,用于自动化和简化Ansible角色和播放程序的测试和验证。它使用pytest等测试框架,并为角色或玩法提供一个运行环境。

在本教程中,你将学习如何通过Molecule和Docker自动设置和测试Ansible角色。你将同时安装Ansible、Docker和Molecule,然后学习如何用Molecule创建Ansible Roles的模板,并通过Docker容器设置Ansible Roles的自动测试。

前提条件


要完成本教程,你必须具备以下条件:

  • 一个Linux系统--本例使用最新版本的Ubuntu 22.04服务器,主机名为 "ansible-test"。
  • 一个具有sudo/root管理员权限的非root用户--本例使用一个名为 "alice "的用户。
  • 了解Ansible和Ansible角色。


安装依赖项


在第一节中,你将安装在以下指南中使用的包的依赖项。这包括Python3、Pip、Ansible和Docker CE(社区版)。在你开始之前,运行以下命令来更新和刷新你的软件包索引。

sudo apt update

一旦软件包索引被更新,输入以下命令来安装Python3、Pip3、Virtualenv和Ansible。

sudo apt install python3 python3-pip python3-venv ansible ca-certificates curl gnupg lsb-release

在提示时输入y,然后按回车键继续。



在Python3、Pip3、Virtualenv和Ansible安装完毕后,你将通过官方的Docker仓库安装Docker CE(社区版)。

输入以下命令,创建一个新目录"/etc/apt/keyrings",并下载Docker仓库的GPG密钥。

sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

接下来,使用下面的命令将Docker CE仓库添加到你的系统中。

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null



然后更新并刷新你的ubuntu软件包索引以应用这些变化。

sudo apt update

现在通过下面的'apt'命令安装Docker CE软件包。当出现提示时,输入y来确认,然后按回车键继续。

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin



安装好Docker CE后,使用下面的命令将你当前的用户添加到 "docker "组。这将使你的用户能够运行Docker容器。

sudo usermod -aG docker $USER

现在你可以使用下面的命令验证Docker配置。这将在你的系统上下载并运行容器 "hello-world"。

docker run hello-world

如果用户可以执行Docker容器,你应该看到 "hello-world "容器的输出,如下所示。



这样一来,你现在已经安装了Python3、Pip3、Virtualenv、Ansible和Docker等软件包依赖项。在下一节,你将在Python虚拟环境中安装Molecule。

安装Molecule


在本节中,你将创建一个新的Python虚拟环境,用于Ansible Roles的开发环境。你还将安装Molecule和Docker驱动。

运行下面的命令来创建一个新的Python虚拟环境,名为 "ansible-venv"。一旦虚拟环境被创建,你应该在当前工作目录上看到新的目录 "ansible-venv"。

python3 -m venv ansible-venv

接下来,运行下面的命令来激活你的Python虚拟环境。一旦被激活,你的提示外壳将变成这样: '(ansible-venv) user@hostname:...'。

source ansible-venv/bin/activate

现在把你的工作目录移到'ansible-venv',然后用'pip3'命令安装Python包Molecule和Molecule Docker驱动,如下所示。

cd ansible-venv/
pip3 install wheel molecule 'molecule-plugins[docker]'

下面你可以看到Molecule和Docker驱动的安装过程:



在Molecule和Docker驱动安装完毕后,接下来你将通过Molecule创建一个新的Ansible角色。

用Molecule初始化Ansible角色


在安装完Molecule和Docker驱动后,现在你将通过Molecule创建新的Ansible角色。在这个例子中,你将创建角色,用于安装基本的LEMP Stack(Linux、Nginx、MariaDB和PHP-FPM)包,并确保LEMP Stack服务正在运行和启用。

首先,运行下面的命令,生成Ansible角色模板 "test.lemp",驱动为 "docker"。这将在你的当前工作目录下创建一个新的目录,名为 "lemp"。

molecule init role test.lemp --driver-name docker



使用下面的命令移动到'lemp'目录。

cd lemp

用nano编辑器打开 "tasks/main.yml "文件,为你的角色定义一些任务。

nano tasks/main.yml

在该文件中添加以下几行。通过这个,你将创建安装LEMP堆栈包和验证LEMP服务的任务。

---
- name: "Installing LEMP Stack"
  apt:
    name: "{{ pkg_list }}"
    state: present

- name: "Ensure LEMP Services is running"
  service:
    name: "{{ item }}"
    state: started
    enabled: true
  with_items: "{{ svc_list }}"

完成后保存并关闭该文件。



现在用nano编辑器打开 "vars/main.yml "文件,为Ansible角色添加变量。

nano vars/main.yml

在该文件中添加以下几行。在这个例子中,你将定义变量 "pkg_list",其中包含LEMP栈的包名,以及变量 "svc_list",其中包含LEMP栈的服务名。

---
pkg_list:
  - nginx
  - mariadb-server
  - php-fpm
  - php-cli
svc_list:
  - nginx
  - mariadb
  - php8.1-fpm

保存该文件,完成后退出编辑器。




设置测试用的实例


创建完Ansible角色后,你需要设置用来测试Ansible角色的实例。这个例子将使用Docker镜像 "mipguerrero26/ubuntu-python3",它默认包含Python3包。你可以使用不同的Docker镜像,但你必须确保Python已经安装。

首先,运行以下命令,下载Docker镜像'mipguerrero26/ubuntu-python3'。

docker pull mipguerrero26/ubuntu-python3



下载完成后,使用下面的命令验证镜像列表。你应该看到Docker镜像 "mipguerrero26/ubuntu-python3 "已经下载并在你的系统上可用。

docker images



现在运行下面的命令来运行一个临时容器,并在附加模式下执行bash。

docker run -it mipguerrero26/ubuntu-python3 /bin/bash

一旦登录到容器中,输入以下命令来验证Python和Ubuntu的版本。

python3 --version
cat /etc/lsb-release

你应该收到这样的输出--在这个例子中,镜像 "mipguerrero26/ubuntu-python3 "是基于Ubuntu 22.04的,并带有Python。



输入'exit'从容器外壳中注销。

接下来,用nano编辑器打开默认的Molecule配置 "molecule/default/molecule.yml"。

nano molecule/default/molecule.yml

在 "平台 "部分,改变名称和将用于测试的默认图像。另外,添加设置 "priorleged: true"。在这个例子中,用于测试的实例将被命名为'instance-ubuntu22.04',镜像为'mipguerrero26/ubuntu-python3'。

platforms:
  - name: instance-ubuntu22.04
    image: mipguerrero26/ubuntu-python3
    privileged: true

保存文件并退出编辑器。



现在运行下面的'molecule'命令来验证你的Molecule测试项目中的实例列表。你应该看到名为'instance-ubuntu22.04'的实例,驱动为'Docker'。

molecule list



运行Molecule Test Converge


随着Molecule实例的创建,现在你可以通过简单地调用 "molecule converge "命令来运行测试,如下所示。这个'converge'参数允许你针对Molecule项目上的实例测试和验证Ansible角色。在这个例子中,Ansible角色 "lemp "将通过Docker针对实例 "instance-ubuntu22.04 "运行。

molecule converge

下面是Molecule运行时的输出。



Molecule的任务是通过Docker创建一个新的实例用于测试。



一旦实例被创建,Ansible角色将被应用于该实例。



此时,Ansible角色 "lemp "被应用到实例 "instance-ubuntu22.04 "上,该实例通过Docker运行。输入以下命令来验证系统上运行的容器。

docker ps

你应该看到名为'instance-ubuntu22.04'的容器,它与Molecule实例名称相匹配。



现在用下面的命令登录到容器'instance-ubuntu22.04'中。

docker exec -it instance-ubuntu22.04 /bin/bash

然后用下面的命令验证容器上的开放端口列表。你应该看到Nginx使用的80端口,MariaDB使用的3306端口,以及PHP-FPM运行的sock文件"/run/php/php8.1-fpm.sock"。这证实了角色 "lemp "正在成功运行。

ss -tulpn
ss -pl | grep php



最后,运行下面的命令来清理你的环境。这将从你的系统中销毁并删除容器 "instance-ubuntu22"。

molecule destroy



如果你检查你的系统上正在运行的容器列表,将没有正在运行的容器,因为实例'instance-ubuntu22'被删除了。

docker ps
docker ps -a



用testInfra Python模块创建测试脚本


在本节中,你将创建测试脚本场景,用来验证Molecule实例的状态,并确保角色被应用。这可以通过使用模块testInfra的Python脚本来完成。

首先,运行下面的pip3命令来安装testInfra模块。

pip3 install pytest-testinfra



一旦testinfra模块安装完毕,创建一个新的目录'molecule/default/tests/',并使用以下nano编辑器命令创建一个新的测试文件'molecule/default/tests/test_default.py'。

mkdir -p molecule/default/tests/
nano molecule/default/tests/test_default.py

在该文件中添加以下Python脚本。通过这个,你将测试Ansible Molecule实例,以确保LEMP Stack包已经安装并运行。

import os
import pytest
import testinfra.utils.ansible_runner

testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
    os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')

@pytest.mark.parametrize('pkg', [
  'nginx',
  'mariadb-server',
  'php-fpm'
])
def test_pkg(host, pkg):
    package = host.package(pkg)

    assert package.is_installed

@pytest.mark.parametrize('svc', [
  'nginx',
  'mariadb',
  'php8.1-fpm'
])
def test_svc(host, svc):
    service = host.service(svc)

    assert service.is_running
    assert service.is_enabled

完成后保存并关闭该文件。



接下来,使用nano编辑器打开Molecule配置文件'molecule/default/molecule.yml'来定义测试。

nano molecule/default/molecule.yml

在'verifier'部分,将名称改为'testinfra',并添加参数'directory: tests'。这意味着测试脚本将取自目录'test'。

verifier:
  name: testinfra
  directory: tests

保存该文件并退出编辑器。



现在执行以下命令,从头到尾运行所有场景的测试。molecule test "命令将通过创建实例开始测试,申请Ansible角色,运行测试,然后销毁一切进行清理。

molecule test

下面是'test'命令初始化时的截图,如果有的话,Ansible Molecule会销毁现有的实例。





现在是为新的测试创建一个实例的过程。



然后,Ansible角色将被应用于该实例。



当角色被应用后,测试或验证器将开始。当成功时,你应该得到一个输出,如'收集了6个项目--6个通过了...'。



最后,Molecule将在测试完成后销毁实例。



开发中的Ansible Molecule过程


当第一次开发角色时,你必须确保角色是通过Molecule生成的。然后,你可以向Ansible角色添加任务和其他组件,定义测试用的实例,然后设置测试脚本,确保所需的状态被应用到目标实例。

因此,当你完成了Ansible角色的配置并定义了实例后,运行以下命令来测试Ansible角色在测试实例中的实现。

molecule converge

现在在Molecule配置上创建了测试脚本并定义了测试后,运行下面的命令来应用该测试。

molecule verify

当测试成功后,你现在可以销毁一切,并使用下面的命令重新测试。

molecule destroy
molecule test

你可以通过下面的命令检查Ansible Molecule的详细可用参数。

molecule --help


总结


在本教程中,你已经学会了Ansible Molecule的安装,它允许你通过多种场景对Ansible角色和playbook进行端到端的测试。你还学习了如何通过Molecule创建角色,并通过Docker运行Ansible角色的测试。最后,你还学会了如何用模块testInfra创建一个Python测试脚本,可以用来验证所需机器/服务器的状态。

最后,你现在更好地理解了如何测试Ansible角色并与Molecule和Docker一起工作。通过访问Ansible Molecule的官方文档了解更多关于Ansible Molecule的信息。

文章相关标签: Ansible Molecule Docker
购物车