常见Molecule用例

在容器内运行

分子被构建成码头工人的形象 Toolset 项目。

与容器中分子的使用相关的任何问题或错误都应该由工具集项目来解决。

具有非特权用户的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中的角色。

用分子(在本例中为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 标记到命令以避免并发问题。