常见Molecule用例

在容器内运行

虽然molecule项目本身并不构建容器,但我们建议您使用 toolset 容器,也包含Molecule。

任何与在容器中使用Molecule有关的问题或错误,都应该由工具集项目解决。

具有非特权用户的Docker

默认的molecular Docker驱动程序作为根用户执行Ansible playbooks。如果您的工作流需要一个非特权用户,那么 molecule.ymlDockerfile.j2 如下所述。

将以下代码块附加到 Dockerfile.j2 . 它创造了一个 ansible 具有无密码sudo权限的用户。

变量 SUDO_GROUP 取决于目标分布。 centos:8 使用 wheel .

# Create `ansible` user with sudo permissions and membership in `DEPLOY_GROUP`
ENV ANSIBLE_USER=ansible SUDO_GROUP=wheel DEPLOY_GROUP=deployer
RUN set -xe \
  && groupadd -r ${ANSIBLE_USER} \
  && groupadd -r ${DEPLOY_GROUP} \
  && useradd -m -g ${ANSIBLE_USER} ${ANSIBLE_USER} \
  && usermod -aG ${SUDO_GROUP} ${ANSIBLE_USER} \
  && usermod -aG ${DEPLOY_GROUP} ${ANSIBLE_USER} \
  && sed -i "/^%${SUDO_GROUP}/s/ALL\$/NOPASSWD:ALL/g" /etc/sudoers

修改 provisioner.inventory 在里面 molecule.yml 如下:

platforms:
  - name: instance
    image: centos:8
    # …
provisioner:
  name: ansible
  # …
  inventory:
    host_vars:
      # setting for the platform instance named 'instance'
      instance:
        ansible_user: ansible

一定要用你的手机 平台实例名称 . 在这种情况下 instance .

不同平台实例名称的示例:

platforms:
  - name: centos8
    image: centos:8
    # …
provisioner:
  name: ansible
  # …
  inventory:
    host_vars:
      # setting for the platform instance named 'centos8'
      centos8:
        ansible_user: ansible

要测试它,请将以下任务添加到 tasks/main.yml . 它失败了,因为不允许非特权用户在中创建文件夹 /opt/ . 这需要使用 sudo .

使用 sudo ,取消注释 become: yes . 现在任务将成功。

- name: Create apps dir
  file:
    path: /opt/examples
    owner: ansible
    group: deployer
    mode: 0775
    state: directory
  # become: yes

别忘了跑步 molecule destroy 如果已经创建了图像。

Docker内的Podman

有时您的CI系统准备与Docker一起运行,但您希望将podman测试到其中。这个 prepare.yml playbook将通过添加一些必需的设置,让podman在特权Docker主机内运行:

- name: prepare
  hosts: podman-in-docker
  tasks:
    - name: install fuse-overlayfs
      package:
        name:
          - fuse-overlayfs

    - name: create containers config dir
      file:
        group: root
        mode: a=rX,u+w
        owner: root
        path: /etc/containers
        state: directory

    - name: make podman use fuse-overlayfs storage
      copy:
        content: |
          # See man 5 containers-storage.conf for more information
          [storage]
          driver = "overlay"
          [storage.options.overlay]
          mount_program = "/usr/bin/fuse-overlayfs"
          mountopt = "nodev,metacopy=on"
        dest: /etc/containers/storage.conf
        group: root
        mode: a=r,u+w
        owner: root

    - name: make podman use cgroupfs cgroup manager
      copy:
        content: |
          # See man 5 libpod.conf for more information
          cgroup_manager = "cgroupfs"
        dest: /etc/containers/libpod.conf
        group: root
        mode: a=r,u+w
        owner: root

另一种选择是直接在 molecule.yml 定义:

driver:
  name: podman
platforms:
  - name: podman-in-docker
    # ... other options
    cgroup_manager: cgroupfs
    storage_opt: overlay.mount_program=/usr/bin/fuse-overlayfs
    storage_driver: overlay

在撰写本文时, Gitlab CI shared runners run privileged Docker hosts 适合这些解决方法。

系统容器

要启动需要systemd的服务, in a non-privileged container ,配置 molecule.yml 使用符合systemd的映像、tmpfs、卷和命令,如下所示。

platforms:
  - name: instance
    image: centos:8
    command: /sbin/init
    tmpfs:
      - /run
      - /tmp
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro

请注意centos:8图像包含 seccomp security profile for Docker 它支持使用systemd。当需要时,可以重用这样的安全配置文件(例如 the one available in Fedora ):

platforms:
  - name: instance
    image: debian:stretch
    command: /sbin/init
    security_opts:
      - seccomp=path/to/seccomp.json
    tmpfs:
      - /run
      - /tmp
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro

开发者也可以选择 start the container with extended privileges ,或者 SYS_ADMIN 功能或运行它 privileged 模式。

重要

使用时要小心 privileged 模式或 SYS_ADMIN 它授予容器对底层系统的提升访问权限。

要限制扩展权限的范围,请授予 SYS_ADMIN 功能以及相同的映像、命令和卷,如中所示 non-privileged 例子。

platforms:
  - name: instance
    image: centos:8
    command: /sbin/init
    capabilities:
      - SYS_ADMIN
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro

在中启动容器 privileged 模式下,将特权标志与中所示的相同图像和命令一起设置 non-privileged 例子。

platforms:
  - name: instance
    image: centos:8
    command: /sbin/init
    privileged: True

整体式回购

Molecule通常用于单独测试角色。不过,它也可以测试monolith repo中的角色。

用Molecule初始化的角色(本例中为baz)将通过其 converge.yml 或者元依赖。

Molecule可以利用这种技术测试复杂的场景。

$ cd monolith-repo/roles/baz
$ molecule test

Molecule只是设定了 ANSIBLE_* 环境变量。要查看Molecule操作期间设置的环境变量,请通过 --debug 旗帜。

$ molecule --debug test

DEBUG: ANSIBLE ENVIRONMENT
---
ANSIBLE_CONFIG: /private/tmp/monolith-repo/roles/baz/molecule/default/.molecule/ansible.cfg
ANSIBLE_FILTER_PLUGINS: /Users/jodewey/.pyenv/versions/2.7.13/lib/python2.7/site-packages/molecule/provisioner/ansible/plugins/filters:/private/tmp/monolith-repo/roles/baz/plugins/filters:/private/tmp/monolith-repo/roles/baz/molecule/default/.molecule/plugins/filters
ANSIBLE_LIBRARY: /Users/jodewey/.pyenv/versions/2.7.13/lib/python2.7/site-packages/molecule/provisioner/ansible/plugins/libraries:/private/tmp/monolith-repo/roles/baz/library:/private/tmp/monolith-repo/roles/baz/molecule/default/.molecule/library
ANSIBLE_ROLES_PATH: /private/tmp/monolith-repo/roles:/private/tmp/monolith-repo/roles/baz/molecule/default/.molecule/roles

Molecule可以通过多种方式定制。正在更新中provisioner的env节 molecule.yml 以适应开发商的需求和项目的布局。

provisioner:
  name: ansible
  env:
    ANSIBLE_$VAR: $VALUE

跨场景共享

剧本和测试可以跨场景共享。

$ tree shared-tests
shared-tests
├── molecule
│   ├── centos
│   │   └── molecule.yml
│   ├── resources
│   │   ├── playbooks
│   │   │   ├── Dockerfile.j2 (optional)
│   │   │   ├── create.yml
│   │   │   ├── destroy.yml
│   │   │   ├── converge.yml  # <-- previously called playbook.yml
│   │   │   └── prepare.yml
│   │   └── tests
│   │       └── test_default.py
│   ├── ubuntu
│   │   └── molecule.yml
│   └── ubuntu-upstart
│       └── molecule.yml

测试和剧本可以跨场景共享。

在这个例子中, tests 目录位于共享位置,并且 molecule.yml 指向共享测试。

verifier:
  name: testinfra
  directory: ../resources/tests/

在第二个例子中,动作 createdestroyconvergeprepare 从共享目录加载。

provisioner:
  name: ansible
  playbooks:
    create: ../resources/playbooks/create.yml
    destroy: ../resources/playbooks/destroy.yml
    converge: ../resources/playbooks/converge.yml
    prepare: ../resources/playbooks/prepare.yml

以并行模式运行Molecule进程

重要

这种功能应该被认为是实验性的。这是正在进行的工作的一部分,以实现在Molecule特征集的执行中跨所有移动部件的可并行化功能。

注解

只有以下序列支持并行化功能:

  • check_sequence: molecule check --parallel

  • destroy_sequence: molecule destroy --parallel

  • test_sequence: molecule test --parallel

它目前仅可用于Docker驱动程序。

当Molecule接收到 --parallel 它将生成一个 UUID 并将使用该唯一标识符来缓存该进程的运行时状态。因此,并行Molecule处理缓存状态并创建实例不会相互干扰。

Molecule在 $HOME/.cache/molecule_parallel 位置。Molecule暴露了一个新的环境变量 MOLECULE_PARALLEL 可以启用此功能。

可以使用另一个工具来协调并行化(例如 GNU ParallelPytest ). 如果你这么做了,通过指定 --parallel 标记到命令以避免并发问题。