常见Molecule用例¶
在容器内运行¶
分子被构建成码头工人的形象 Toolset 项目。
与容器中分子的使用相关的任何问题或错误都应该由工具集项目来解决。
具有非特权用户的Docker¶
默认的molecular Docker驱动程序作为根用户执行Ansible playbooks。如果您的工作流需要一个非特权用户,那么 molecule.yml
和 Dockerfile.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
以并行模式运行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 Parallel 或 Pytest ). 如果你这么做了,通过指定 --parallel
标记到命令以避免并发问题。