使用分子和Podman开发和测试Ansible角色

红帽Ansible自动化平台的主要优点之一是它的自动化语言不仅可以读取给两个专家,而且还可以读取几乎所有涉及IT的人员。因此,任何专家都可以为自动化做出贡献,这极大地促进了团队间互动的组织以及在企业文化水平上自动化的实施。







但是,由于有如此众多的人员参与,因此彻底测试所有内容非常重要。在开发Ansible内容(例如剧本,角色或收藏集)时,我们强烈建议您在投入生产之前在测试环境中测试所有内容。该测试的目的是确保一切正常进行,以避免对“生产”系统造成不愉快的意外。



测试自动化内容是一件棘手的事情,因为它需要部署专用的测试基础架构并设置测试条件以确保测试本身是相关的。Molecule是一个全面的测试框架,可帮助您开发和测试Ansible角色,因此您可以专注于开发自动化,而不会因管理测试基础结构而分心。



这是在项目文档中声明的方式



“ Molecule旨在帮助开发和测试Ansible角色,并培育出一种方法,可以使编写的角色角色书写得好,易于理解和维护。”


Molecule允许您在多个目标实例上测试角色,以在各种操作系统和虚拟化环境中对其进行测试。没有它,对于这些组合中的每一个,您将必须创建并维护一个单独的测试环境,建立与测试实例的连接,并将它们回滚到每个测试之前的原始状态。分子以自动化且可重复的方式为您完成所有任务。



在这个由两部分组成的系列文章中,我们将向您展示如何使用Molecule开发和测试Ansible角色。在第一部分中,我们将研究安装和配置Molecule,在第二部分中,与之一起开发角色。



如果角色是集合的一部分,请使用此方法来开发和单元测试角色。在下一篇文章中,我们将向您展示如何使用Molecule对集合运行集成测试。



Molecule使用驱动程序通过多种技术交付目标实例,包括Linux容器,虚拟机和云提供商。默认情况下,它带有三个预安装的驱动程序:用于容器的Docker和Podman,以及用于创建自定义集成的Delegated驱动程序。项目开发社区提供了其他提供商的驱动程序。



在本文中,我们将使用Podman驱动程序使用Linux容器开发和测试新角色。 Podman是Linux的轻量级容器引擎,不需要运行的守护程序,它允许运行无根容器,这对安全性很有帮助。



我们将Molecule与Podman驱动程序配合使用,我们将从头开发并测试一个新的Ansible角色,该角色将部署基于Apache Web服务器的Web应用程序,并应在Red Hat Enterprise Linux(RHEL)8或Ubuntu 20.04上运行。



我们正在分析一个角色应该在不同版本的操作系统上工作时的典型情况。使用Podman和Linux容器,我们可以创建多个实例来测试不同OS版本上的角色。由于容器轻巧,因此您可以在开发过程中快速迭代角色的功能。在这种情况下,可以使用容器来测试角色,因为角色仅配置正在运行的Linux实例。要在其他目标系统或云基础架构上进行测试,可以使用委托的驱动程序或其他社区提供的驱动程序。



我们需要什么



对于本文中的示例,您需要一台装有Python 3和Podman(我们正在使用RHEL 8.2)的物理或虚拟Linux计算机。另外,必须将Podman配置为运行无根容器。安装Podman不在本文讨论范围之内,请参阅官方文档以获取相关信息RHEL 8容器文档中还介绍了在RHEL 8上安装Podman



让我们开始吧



Molecule被设计为Python软件包,因此通过pip安装。第一步是创建一个专用的Python环境并将我们的Molecule安装到其中:



$ mkdir molecule-blog
$ cd molecule-blog
$ python3 -m venv molecule-venv
$ source molecule-venv/bin/activate
(molecule-venv) $ pip install "molecule[lint]"


请注意,我们正在使用“ lint”选项安装Molecule,以便pip也将提供“ yamllint”和“ ansible-lint”工具,这将使我们能够使用Molecule根据Ansible编码标准静态分析角色代码。



该安装会从Internet(包括Ansible)下载所有必需的依赖项。现在让我们看看我们已经安装了什么:



$ molecule --version
molecule 3.0.4
   ansible==2.9.10 python==3.6


好了,是时候使用“分子”命令初始化新的Ansible角色了。



初始化新的Ansible角色



一般而言,在开发新的Ansible角色时,使用“ ansible-galaxy role init”命令对其进行了初始化,但是我们将使用“ molecule”命令。这将为我们提供与“ ansible-galaxy”命令相同的角色结构,以及用于运行Molecule测试的基本代码。



默认情况下,Molecule使用Docker驱动程序运行测试。因为我们要使用podman,所以在使用“ molecule”命令初始化角色时,必须使用“ --driver-name = podman”选项指定适当的驱动程序。



切换回“ molecule-blog”目录,并使用以下命令初始化新角色“ mywebapp”:



$ molecule init role mywebapp --driver-name=podman
--> Initializing new role mywebapp...
Initialized role in /home/ricardo/molecule-blog/mywebapp successfully.


Molecule在“ mywebapp”文件夹中创建我们的角色结构。切换到此文件夹,然后查看其中的内容:



$ cd mywebapp
$ tree
.
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── molecule
│   └── default
│       ├── converge.yml
│       ├── INSTALL.rst
│       ├── molecule.yml
│       └── verify.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml
 
10 directories, 12 files


Molecule将其配置文件放在“分子”子目录中。初始化新角色时,只有一个脚本称为“默认”。稍后,您可以在此处添加脚本以测试各种条件。在本文中,我们将仅使用“默认”脚本。



让我们检查文件“ molecule / default / molecular.yml”中的基本配置:



$ cat molecule/default/molecule.yml 
---
dependency:
  name: galaxy
driver:
  name: podman
platforms:
  - name: instance
    image: docker.io/pycontribs/centos:7
    pre_build_image: true
provisioner:
  name: ansible
verifier:
  name: ansible


根据我们的要求,该文件表明Podman驱动程序用于测试。在这里,通过容器映像“ docker.io/pycontribs/centos:7”设置了测试实例的默认平台,稍后我们将对其进行更改。



与Molecule v2不同,Molecule v3没有定义默认的短毛绒。因此,打开配置文件“ molecule / default / molecular.yml”,并在末尾添加lint配置:



$ vi molecule/default/molecule.yml
...
verifier:
  name: ansible
lint: |
  set -e
  yamllint .
  ansible-lint .


保存并关闭文件,然后从项目的根文件夹中运行“ molecule lint”命令,以在整个项目中运行linter:



$ molecule lint


由于文件“ meta / main.yml”不包含许多必需的值,因此输出中会出现一些错误。对其进行修复:编辑“ meta / main.yml”文件,添加“作者”,“公司”,“许可证”,“平台”,并删除最后的空行。为简便起见,我们将省略注释,然后我们的“ meta / main.yaml”将如下所示:



$ vi meta/main.yml
galaxy_info:
  author: Ricardo Gerardi
  description: Mywebapp role deploys a sample web app 
  company: Red Hat 
 
  license: MIT 
 
  min_ansible_version: 2.9
 
  platforms:
  - name: rhel
    versions:
    - 8 
  - name: ubuntu
    versions:
    - 20.04
 
  galaxy_tags: []
 
dependencies: []


让我们在项目上再次运行linter,并确保没有其他错误。



$ molecule lint
--> Test matrix
    
└── default
    ├── dependency
    └── lint
    
--> Scenario: 'default'
--> Action: 'dependency'
Skipping, missing the requirements file.
Skipping, missing the requirements file.
--> Scenario: 'default'
--> Action: 'lint'
--> Executing: set -e
yamllint .
ansible-lint . 


因此,我们的角色被初始化,分子的基本构型也就位。现在让我们创建一个测试实例。



创建一个测试实例



默认情况下,分子仅定义一个实例,该实例称为“实例”,并且是从“ Centos:7”图像创建的。如果您还记得,我们的角色应该在RHEL 8和Ubuntu 20.04上起作用。另外,由于它作为系统服务运行Apache Web服务器,因此我们需要一个启用了“ systemd”的容器映像。



红帽已经为RHEL 8启用了“ systemd”的官方通用基础映像



•registry.access.redhat.com /



ubi8 / ubi-init Ubuntu没有官方的“ systemd”映像,因此我们将使用Jeff维护的映像。来自Ansible社区的Geerling(Jeff Geerling):



•geerlingguy / docker-ubuntu2004-ansible



要获取带有“ systemd”的实例,我们通过删除其中的“ centos:7”实例并添加两个新实例来编辑配置文件“ molecule / default / Molecular.yml”



$ vi molecule/default/molecule.yml
---
dependency:
  name: galaxy
driver:
  name: podman
platforms:
  - name: rhel8
    image: registry.access.redhat.com/ubi8/ubi-init
    tmpfs:
      - /run
      - /tmp
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    capabilities:
      - SYS_ADMIN
    command: "/usr/sbin/init"
    pre_build_image: true
  - name: ubuntu
    image: geerlingguy/docker-ubuntu2004-ansible
    tmpfs:
      - /run
      - /tmp
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    capabilities:
      - SYS_ADMIN
    command: "/lib/systemd/systemd"
    pre_build_image: true
provisioner:
  name: ansible
verifier:
  name: ansible
lint: |
  set -e
  yamllint .
  ansible-lint .


使用这些参数,我们为每个实例安装临时文件系统“ / run”和“ / tmp”,以及卷“ cgroup”。另外,我们包括“ SYS_ADMIN”功能,使用Systemd运行容器需要此功能。



如果您一切正常,并且在启用了SELinux的RHEL 8计算机上运行此示例,则还需要将布尔参数“ container_manage_cgroup”设置为true,以便容器可以运行Systemd(有关更多详细信息,请参见RHEL 8文档):



sudo setsebool -P container_manage_cgroup 1


Molecule使用Ansible Playbook初始化这些实例。让我们通过修改“ molecule / default / molecular.yml”配置文件中的“ provisioner”字典来更改和添加初始化参数。



它接受与“ ansible.cfg”配置文件中指定的相同配置选项。例如,让我们通过添加“默认值”部分来更新配置程序配置。将Python解释器设置为“ auto_silent”以禁用警告。让我们包括“ profile_tasks”,“ timer”和“ yaml”回调插件,以便将分析器信息包括在Playbook输出中。最后,添加“ ssh_connection”部分并禁用SSH管道传输,因为它不适用于Podman:



provisioner:
  name: ansible
  config_options:
    defaults:
      interpreter_python: auto_silent
      callback_whitelist: profile_tasks, timer, yaml
    ssh_connection:
      pipelining: false


让我们保存该文件,并从我们角色的根目录中使用“ molecule create”命令创建一个实例:



$ molecule create


Molecule将执行一个初始化剧本并创建我们的两个实例。让我们用“分子列表”命令检查它们:



$ molecule list
Instance Name    Driver Name    Provisioner Name    Scenario Name    Created    Converged
---------------  -------------  ------------------  ---------------  ---------  -----------
rhel8            podman         ansible             default          true       false
ubuntu           podman         ansible             default          true       false


我们还要检查两个容器是否都在Podman中运行:



$ podman ps
CONTAINER ID  IMAGE                                                   COMMAND               CREATED             STATUS                 PORTS  NAMES
2e2f14eaa37b  docker.io/geerlingguy/docker-ubuntu2004-ansible:latest  /lib/systemd/syst...  About a minute ago  Up About a minute ago         ubuntu
2ce0a0ea8692  registry.access.redhat.com/ubi8/ubi-init:latest         /usr/sbin/init        About a minute ago  Up About a minute ago         rhel8


在开发角色时,Molecule使用正在运行的实例对其进行测试。如果测试失败或某些错误导致不可逆转的更改,因此一切都必须重新开始,则可以随时使用“ molecul destroy”命令杀死这些实例,并使用“ molecule create”命令重新创建它们。



结论



如果您不耐烦并且想深入研究角色开发和测试主题或Ansible自动化主题,那么我们建议您使用以下资源:






All Articles