让我们解释一下Molecule的Docker驱动程序

我将解释Molecule Docker Plugin,它是Molecule的Docker驱动程序。

Docker驱动程序是什么?

Molecule的Docker驱动程序是Molecule连接到Docker容器的处理助手。它通过简洁的molecule.yml描述,创建测试环境容器并在测试结束后销毁该容器。

内部主要使用了”community.docker.docker_container”和”community.docker.docker_network”。

除了从外部容器注册表获取Docker镜像的”community.docker.docker_login”之外,还采用了”community.docker.docker_image”来从Dockerfile构建镜像。

此外,容器始终以detached模式运行。目前似乎无法更改。

Docker驱动程序执行的操作

Docker驱动程序的处理定义位于 GitHub 存储库的 src/molecule_docker/playbooks/* 中。处理由存放在这里的Playbook文件执行。此外,如果要向这些Playbook传递变量,主要是在 molecule.yml 的 platform 部分进行记录。

需要注意的是,Docker驱动程序并不可以在”community.docker.docker_container”和”community.docker.docker_network”等模块中设置所有可用参数。您需要仔细查看src/molecule_docker/playbooks/*的定义文件以了解可以设置的参数。

在使用Docker驱动程序时,主要使用的参数

基本上,我们将基于”community.docker.docker_container”的参数进行说明,但本次只讲解 Docker 驱动中常用的基本参数。

环境

设置环境变量。您可以传递云的认证信息、SSH密钥等机密信息。当启动数据库容器时,您仍然可以传递用户名、密码等信息。

图像

可以设置Docker镜像容器存储库的URI。并且还可以从私有存储库中获取Docker镜像。

名字

Molecule是启动Docker容器的名称。作为Docker的特性,如果要启动多个容器,就不能启动同名的容器。如果要启动多个测试用容器,建议使用唯一的名称。

网络模式

可以指定Docker的网络模式。如果不指定,默认情况下会设置为bridge模式。

预先构建图像

如果想要在启动容器后配置Ansible可连接的环境,请将其设置为true。

即使启动一个没有安装Python的镜像,Ansible也无法连接到容器。如果将pre_build_image设置为true,那么对于启动的容器,将安装Python和其他必要的处理,从而使Ansible可以连接到容器。

对于支持pre_build_image的容器,这些容器在GitHub存储库的src/molecule_docker/playbooks/Dockerfile.j2文件中定义。根据处理内容来看,目前似乎只支持Linux容器。

# Molecule managed

{% if item.registry is defined %}
FROM {{ item.registry.url }}/{{ item.image }}
{% else %}
FROM {{ item.image }}
{% endif %}

{% if item.env is defined %}
{% for var, value in item.env.items() %}
{% if value %}
ENV {{ var }} {{ value }}
{% endif %}
{% endfor %}
{% endif %}

RUN if [ $(command -v apt-get) ]; then export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get install -y python3 sudo bash ca-certificates iproute2 python3-apt aptitude && apt-get clean && rm -rf /var/lib/apt/lists/*; \
    elif [ $(command -v dnf) ]; then dnf makecache && dnf --assumeyes install /usr/bin/python3 /usr/bin/python3-config /usr/bin/dnf-3 sudo bash iproute && dnf clean all; \
    elif [ $(command -v yum) ]; then yum makecache fast && yum install -y /usr/bin/python /usr/bin/python2-config sudo yum-plugin-ovl bash iproute && sed -i 's/plugins=0/plugins=1/g' /etc/yum.conf && yum clean all; \
    elif [ $(command -v zypper) ]; then zypper refresh && zypper install -y python3 sudo bash iproute2 && zypper clean -a; \
    elif [ $(command -v apk) ]; then apk update && apk add --no-cache python3 sudo bash ca-certificates; \
    elif [ $(command -v xbps-install) ]; then xbps-install -Syu && xbps-install -y python3 sudo bash ca-certificates iproute2 && xbps-remove -O; fi

特权

通过权限模式启动Docker容器。

根据用途进行使用调整。若使用systemd等服务,则将其设置为privileged: true。

如果不使用systemd进行处理,就不需要启用它。

其他

如果您正在使用Gitlab、Jenkins等托管型的持续集成工具,可能有时想要针对每个测试场景对容器的CPU、内存、块IO等资源进行限制。

用途分类样品

为了设置Docker镜像仓库的URI,将该项作为环境变量由CI工具传递。

不使用systemd和网络

这将是最简单的设置。

---
dependency:
  name: galaxy
driver:
  name: docker
platforms:
  - name: instance
    image: ${MOLECULE_IMAGE}
provisioner:
  name: ansible
verifier:
  name: ansible
scenario:
  test_sequence:
    - dependency
    - syntax
    - create
    - converge
    - verify

样本仓库

    ansible-roles-mamono210/cowsay | GitHub

我們使用systemd,但不使用網絡。

(Note: “systemd” refers to a system and service manager in Linux operating systems)

命令:将/sbin/init、privileged:True。其中的/sbin/init部分可能因Docker镜像而异。

---
dependency:
  name: galaxy
driver:
  name: docker
platforms:
  - name: instance
    image: ${MOLECULE_IMAGE}
    command: /sbin/init
    privileged: True
provisioner:
  name: ansible
verifier:
  name: ansible
scenario:
  test_sequence:
    - dependency
    - syntax
    - create
    - converge
    - verify

样本库 kù)

    ansible-roles-mamono210/vnc_server | GitHub

使用港口

请在命令中设置所需的参数,并在exposed_ports、published_ports中设置需要在测试处理中开放的端口。

如果只是安装Ansible库或其他内容,不需要打开端口。但是如果想要在Molecule中执行动态测试,需要打开端口。

---
dependency:
  name: galaxy
driver:
  name: docker
platforms:
  - name: instance
    image: ${MOLECULE_IMAGE}
    docker_host: "${DOCKER_HOST:-unix://var/run/docker.sock}"
    command:
      - '/sbin/init'
      - '--web.enable-lifecycle'
      - '--config.file=/etc/prometheus/prometheus.yml'
    privileged: True
    exposed_ports:
      - 9100/tcp
      - 9090/tcp
    published_ports:
      - 0.0.0.0:9100:9100/tcp
      - 0.0.0.0:9090:9090/tcp
provisioner:
  name: ansible
verifier:
  name: ansible
scenario:
  test_sequence:
    - syntax
    - create
    - converge
    - verify

示例代码库

    ansible-roles-mamono210/prometheus | GitHub

建立网络,将容器加入网络。

目前情况下,Docker驱动程序无法处理该请求。

根据GitHub存储库src/molecule_docker/playbooks/*中的Docker驱动程序处理定义文件来看,只考虑了单个容器的启动和销毁,因此如果要使用多个容器,必须使用delegated驱动程序。

使用委派驱动程序时,在使用Docker网络功能时要注意Docker资源的创建顺序。通常情况下,

    1. Docker网络

 

    1. 数据库容器

 

    应用容器

这是顺序。

削除順序相反

    1. 应用容器

 

    1. 数据库容器

 

    Docker网络

可能是好的吧。

当将Docker容器的配置集中在molecule.yml上时,便于日后查看时更加清晰易懂。

这个问题纯属个人喜好。

---
dependency:
  name: galaxy
driver:
  name: delegated
platforms:
  - name: wordpress
    image: ${MOLECULE_IMAGE}
    command: /sbin/init
    detach: yes
    networks:
      - name: molecule_wordpress
    privileged: yes
    ports:
      - "80:80"
    state: started
    tty: yes
  - name: db
    image: mysql:5.7
    networks:
      - name: molecule_wordpress
    state: started
    env:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
  - name: selenium
    image: selenium/standalone-firefox:latest
    networks:
      - name: molecule_wordpress
    ports:
      - "4444:4444"
    state: started
provisioner:
  name: ansible
  config_options:
    defaults:
      callbacks_enabled: ansible.posix.profile_tasks
  connection_options:
    wp_host: 'wordpress'
    php_packages:
      - php
      - php-gd
      - php-gmp
      - php-intl
      - php-ldap
      - php-mbstring
      - php-mcrypt
      - php-mysqlnd
      - php-opcache
      - php-pdo
      - php-pear
      - php-pear-Net-Curl
      - php-pecl-apcu-bc
      - php-pecl-redis
      - php-pecl-zip
      - php-soap
      - php-xml
verifier:
  name: ansible
scenario:
  converge_sequence:
    - converge
  destroy_sequence:
    - destroy
  test_sequence:
    - dependency
    - syntax
    - create
    - converge
    - verify
    - destroy
---
- name: Create
  hosts: localhost
  connection: local

  tasks:
    - name: set_fact molecule_platforms
      ansible.builtin.set_fact:
        molecule_platforms: "{{ molecule_yml.platforms }}"

    - name: Create a network
      community.docker.docker_network:
        name: "{{ molecule_platforms.0.networks[0].name }}"

    - name: Setup MySQL container
      community.docker.docker_container:
        name: "{{ molecule_platforms.1.name }}"
        image: "{{ molecule_platforms.1.image }}"
        networks:
          - name: "{{ molecule_platforms.1.networks[0].name }}"
        state: "{{ molecule_platforms.1.state }}"
        env:
          MYSQL_ROOT_PASSWORD: "{{ molecule_platforms.1.env.MYSQL_ROOT_PASSWORD }}"
          MYSQL_DATABASE: "{{ molecule_platforms.1.env.MYSQL_DATABASE }}"
          MYSQL_USER: "{{ molecule_platforms.1.env.MYSQL_USER }}"
          MYSQL_PASSWORD: "{{ molecule_platforms.1.env.MYSQL_PASSWORD }}"

    - name: Setup WordPress container
      community.docker.docker_container:
        name: "{{ molecule_platforms.0.name }}"
        command: "{{ molecule_platforms.0.command }}"
        detach: "{{ molecule_platforms.0.detach }}"
        image: "{{ molecule_platforms.0.image }}"
        networks:
          - name: "{{ molecule_platforms.0.networks[0].name }}"
        privileged: "{{ molecule_platforms.0.privileged }}"
        ports:
          - "{{ molecule_platforms.0.ports[0] }}"
        state: "{{ molecule_platforms.0.state }}"
        tty: "{{ molecule_platforms.0.tty }}"

    - name: Setup Selenium container
      community.docker.docker_container:
        name: "{{ molecule_platforms.2.name }}"
        image: "{{ molecule_platforms.2.image }}"
        networks:
          - name: "{{ molecule_platforms.2.networks[0].name }}"
        ports:
          - "{{ molecule_platforms.2.ports[0] }}"
        state: "{{ molecule_platforms.2.state }}"
---
- name: Destroy
  hosts: localhost
  connection: local

  tasks:
    - name: set_fact molecule_platforms
      ansible.builtin.set_fact:
        molecule_platforms: "{{ molecule_yml.platforms }}"

    - name: Remove Selenium container
      community.docker.docker_container:
        name: "{{ molecule_platforms.2.name }}"
        state: absent

    - name: Remove WordPress container
      community.docker.docker_container:
        name: "{{ molecule_platforms.0.name }}"
        state: absent

    - name: Remove MySQL container
      community.docker.docker_container:
        name: "{{ molecule_platforms.1.name }}"
        state: absent

    - name: Delete a network
      community.docker.docker_network:
        name: "{{ molecule_platforms.0.networks }}"
        state: absent
        force: yes

范例储存库

    ansible-roles-mamono210/wordpress_insall | GitHub

总结

如果容器的网络结构比较简单,那么积极采用Docker驱动程序可能会有好处。

如果网络很复杂,就采用委托驱动程序来编写create.yml和destroy.yml文件中启动/删除网络和容器的过程。

相关文章

    Moleculeテスト環境用のDockerゴールデンイメージを作成する – Qiita
广告
将在 10 秒后关闭
bannerAds