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的自动测试。
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。
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 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
保存该文件,完成后退出编辑器。
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 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
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将在测试完成后销毁实例。
molecule converge
现在在Molecule配置上创建了测试脚本并定义了测试后,运行下面的命令来应用该测试。
molecule verify
当测试成功后,你现在可以销毁一切,并使用下面的命令重新测试。
molecule destroy
molecule test
你可以通过下面的命令检查Ansible Molecule的详细可用参数。
molecule --help
上一条: 如何在AlmaLinux 9上安装Apache Solr
下一条: 注册.pl波兰域名的步骤