配置

class molecule.config.Config

配置类。

Molecule在当前目录中搜索 molecule.yml globbing提供的文件 molecule/*/molecule.yml . 这些文件被实例化为一个Molecule列表 Config 对象,并且每个Molecule子命令对该列表进行操作。

文件所在的目录 molecule.yml 是场景的目录。Molecule在这个目录中执行大多数功能。

这个 Config 对象实例化 Dependency, Driver, LintPlatforms, Provisioner, Verifier, 脚本State 参考文献。

初始化一个新的配置类并返回None。

参数
  • molecule_file -- 包含要分析的Molecule文件路径的字符串。

  • args -- CLI中选项、参数和命令的可选dict。

  • command_args -- 从CLI传递给子命令的可选选项dict。

  • ansible_args -- 提供给 ansible-playbook 命令。

返回

没有

变量替换

class molecule.interpolation.Interpolator

配置选项可能包含环境变量。

例如,假设shell包含 VERIFIER_NAME=testinfra 以下是Molecule.yml已提供。

verifier:
  - name: ${VERIFIER_NAME}

Molecule将取代 $VERIFIER_NAME 价值 VERIFIER_NAME 环境变量。

警告

如果未设置环境变量,则Molecule将替换为空字符串。

两个 $VARIABLE${{VARIABLE}} 支持语法。扩展的shell样式功能,例如 ${{VARIABLE-default}}${{VARIABLE:-default}} 也支持。即使默认值作为另一个环境变量也受到支持,比如 ${{VARIABLE-$DEFAULT}}${{VARIABLE:-$DEFAULT}} . 当两个变量都未定义时,将返回一个空字符串。

如果配置中需要文字美元符号,请使用双美元符号 ($$

Molecule将取代特殊的 MOLECULE_ 中定义的环境变量 molecule.yml .

重要

记住,那个 MOLECULE_ 命名空间是为Molecule保留的。不要给你自己的变量加前缀 MOLECULE_ .

一个文件可以作为 .env.yml ,在渲染时,Molecule将读取变量 molecule.yml . 请参见命令用法。

构造插值器。

中提供了以下环境变量 molecule.yml

变量

描述

MOLECULE_DEBUG

如果调试已打开或关闭

MOLECULE_FILE

配置文件的路径

MOLECULE_ENV_FILE

Molecule环境文件的路径

MOLECULE_STATE_FILE

是吗?

MOLECULE_INVENTORY_FILE

生成的库存文件的路径

MOLECULE_EPHEMERAL_DIRECTORY

生成目录的路径,通常是 ~/.cache/molecule/<scenario-name>

MOLECULE_SCENARIO_DIRECTORY

方案目录的路径

MOLECULE_PROJECT_DIRECTORY

项目目录的路径

MOLECULE_INSTANCE_CONFIG

是吗?

MOLECULE_DEPENDENCY_NAME

依赖类型名称,通常为“galaxy”

MOLECULE_DRIVER_NAME

驱动程序的名称

MOLECULE_PROVISIONER_NAME

provisioner工具的名称(通常为“ansible”)

MOLECULE_REPORT

转储执行报告的HTML文件的名称。

MOLECULE_SCENARIO_NAME

场景的名称

MOLECULE_VERBOSITY

确定可解释的详细级别。

MOLECULE_VERIFIER_NAME

验证工具的名称(通常为“ansible”)

MOLECULE_VERIFIER_TEST_DIRECTORY

是吗?

附属国

测试角色可能依赖于其他依赖项。Molecule通过调用可配置的依赖关系管理器来管理这些依赖关系。

易变星系

class molecule.dependency.ansible_galaxy.AnsibleGalaxy

Galaxy 是默认的依赖关系管理器。

其他选项可以传递给 ansible-galaxy install 本节中设置的任何选项都将覆盖默认值。

注解

Molecule将删除任何匹配的选项'^ [v] +$,然后通过 -vvv 到基础 ansible-galaxy 执行时的命令 molecule --debug .

dependency:
  name: galaxy
  options:
    ignore-certs: True
    ignore-errors: True
    role-file: requirements.yml
    requirements-file: collections.yml

如果只有角色,请使用“角色文件”。如果需要安装集合,请使用“需求文件”。注意,有了ansiblegalaxy的collections支持,如果您的文件看起来像这样,您现在可以将这两个列表合并为一个需求

roles:
  - dep.role1
  - dep.role2
collections:
  - ns.collection
  - ns2.collection2

如果你想把它们结合起来,那就用你的手指 role-filerequirements-file 走同一条路。默认情况下不会这样做,因为 role-file 只需要角色列表,而集合必须位于 collections: 默认情况下,文件中的键并同时指向同一个文件可能会破坏现有代码。

可以通过设置 enabled 错了。

dependency:
  name: galaxy
  enabled: False

环境变量可以传递给依赖项。

dependency:
  name: galaxy
  env:
    FOO: bar

构造AnsibleGalaxy。

Shell

class molecule.dependency.shell.Shell

Shell 是备用依赖关系管理器。

它用于在以下情况下运行命令: Ansible Galaxy 这还不够。

这个 command 执行是必需的,并且在引用不在$PATH中的脚本时相对于Molecule的项目目录。

注解

与其他依赖关系管理器不同, options 被忽略,不传递给 shell . 附加的标志/子命令只需添加到 command .

dependency:
  name: shell
  command: path/to/command --flag1 subcommand --flag2

可以通过设置 enabled 错了。

dependency:
  name: shell
  command: path/to/command --flag1 subcommand --flag2
  enabled: False

环境变量可以传递给依赖项。

dependency:
  name: shell
  command: path/to/command --flag1 subcommand --flag2
  env:
    FOO: bar

构造外壳。

驱动程序

Molecule用途 Ansible 管理要操作的实例。Molecule支持任何提供者 Ansible 支持。这项工作交给了工程师 provisioner .

在中指定了驱动程序的名称 molecule.yml ,并且可以在命令行上重写。Molecule将记住最后一个成功使用的驱动程序,并继续为所有后续子命令使用该驱动程序,或者直到实例被Molecule销毁。

重要

验证者必须支持Ansible提供者进行适当的Molecule整合。

驱动程序的python包需要安装。

委派

class molecule.driver.delegated.Delegated

负责管理委托实例的类。

委托的是 not 在Molecule中使用的默认驱动程序。

在这个驱动下,开发人员负责实现创建和销毁剧本。 Managed 是所有司机的默认行为。

driver:
  name: delegated

但是,开发人员必须遵守实例配置API。开发者的create playbook必须提供以下实例配置数据,而destroy playbook必须重置实例配置。

- address: ssh_endpoint
  identity_file: ssh_identity_file  # mutually exclusive with password
  instance: instance_name
  port: ssh_port_as_string
  user: ssh_user
  password: ssh_password  # mutually exclusive with identity_file
  become_method: valid_ansible_become_method  # optional
  become_pass: password_if_required  # optional

- address: winrm_endpoint
  instance: instance_name
  connection: 'winrm'
  port: winrm_port_as_string
  user: winrm_user
  password: winrm_password
  winrm_transport: ntlm/credssp/kerberos
  winrm_cert_pem: <path to the credssp public certificate key>
  winrm_cert_key_pem: <path to the credssp private certificate key>
  winrm_server_cert_validation: validate/ignore

本文介绍如何在Ansible中配置和使用WinRM:https://docs.ansible.com/ansible/latest/useru guide/windowsu winrm.html

Molecule还可以跳过配置/取消配置步骤。开发人员负责管理实例,并正确配置连接到所述实例的Molecule。

driver:
  name: delegated
  options:
    managed: False
    login_cmd_template: 'docker exec -ti {instance} bash'
    ansible_connection_options:
      ansible_connection: docker
platforms:
  - name: instance-docker
$ docker run \
    -d \
    --name instance-docker \
    --hostname instance-docker \
    -it molecule_local/ubuntu:latest sleep infinity & wait

对委托实例使用Molecule,这些实例可以通过ssh访问。

重要

开发人员负责配置ssh配置文件。

driver:
  name: delegated
  options:
    managed: False
    login_cmd_template: 'ssh {instance} -F /tmp/ssh-config'
    ansible_connection_options:
      ansible_connection: ssh
      ansible_ssh_common_args: '-F /path/to/ssh-config'
platforms:
  - name: instance

提供Molecule将保留的文件 destroy 行动。

driver:
  name: delegated
  safe_files:
    - foo

为了使用localhost作为Molecule的目标:

driver:
  name: delegated
  options:
    managed: False
    ansible_connection_options:
      ansible_connection: local

委托构造。

Lint

从v3开始,Molecule通过调用和外部lint命令来处理项目linting,如下所示。

移除复杂的 linting 支持的决定并不容易,因为我们确实发现它非常有用。问题是molecule在场景中运行,linting通常在存储库级别执行。

在每个项目的多个位置执行linting没有什么意义。Molecon最多可以使用三个 linter,虽然它的目的是灵活处理,但最终却给用户带来了更多的困惑。我们决定通过调用一个外部shell命令来最大限度地提高灵活性。

lint: |
  set -e
  yamllint .
  ansible-lint
  flake8

旧的格式不再受支持,您必须更新 molecule.yml 当你升级的时候。如果您不想执行任何linting,则从文件中删除所有与lint相关的部分就足够了。

# old v2 format, no longer supported
lint:
  name: yamllint
  enabled: true
provisioner:
  lint:
    name: ansible-lint
  options: ...
  env: ...
verifier:
  lint:
    name: flake8

平台

class molecule.platforms.Platforms

平台定义要测试的实例,以及实例所属的组。

platforms:
  - name: instance-1

可以提供多个实例。

platforms:
  - name: instance-1
  - name: instance-2

将实例映射到组。这些组将由 Provisioner 用于编排目的。

platforms:
  - name: instance-1
    groups:
      - group1
      - group2

子级允许创建一组一组的组。

platforms:
  - name: instance-1
    groups:
      - group1
      - group2
    children:
      - child_group1

初始化一个新的平台类并返回None。

参数

config -- Molecule构型的实例。

返回

没有

供应者

Molecule处理供应和聚合角色。

Ansible

class molecule.provisioner.ansible.Ansible

Ansible 是默认的provisioner。不支持其他provisioner。

Molecule的provisioner管理实例的生命周期。但是,用户必须提供create、destroy和converge playbooks。Molecule的 init 为方便起见,子命令将提供必要的文件。

Molecule将跳过标记为 molecule-notestnotest . 带标签的 molecule-idempotence-notest 仅在幂等操作步骤中跳过任务。

重要

保留“创建和销毁剧本”以进行资源调配。不要试图收集事实或在这些剧本中的配置节点上执行操作。由于需要体操同步状态之间的Ansible和Molecule,它是最好的执行这些任务的准备或会聚剧本。

开发人员负责将模块的事实数据正确地映射到createplaybook中的instanceconfdict事实中。这使得Molecule能够正确配置Ansible库存。

其他选项可以传递给 ansible-playbook 本节中设置的任何选项都将覆盖默认值。

重要

选项不影响创建和销毁操作。

注解

Molecule将删除任何匹配的选项'^ [v] +$,然后通过 -vvv 到基础 ansible-playbook 执行时的命令 molecule --debug .

除非用 --debug 旗帜。但是,这会产生相当多的输出。要启用Ansible日志输出,请将以下内容添加到 provisioner 截面 molecule.yml .

provisioner:
  name: ansible
  log: True

Docker和Podman的创建/销毁剧本与Molecule捆绑在一起。这些剧本有一个来自 molecule.yml ,和是最常用的。捆绑的剧本仍然可以被覆盖。

剧本加载顺序为:

  1. provisioner.playbooks.$driver_name.$action

  2. provisioner.playbooks.$action

  3. bundled_playbook.$driver_name.$action

provisioner:
  name: ansible
  options:
    vvv: True
  playbooks:
    create: create.yml
    converge: converge.yml
    destroy: destroy.yml

角色之间共享剧本。

provisioner:
  name: ansible
  playbooks:
    create: ../default/create.yml
    destroy: ../default/destroy.yml
    converge: converge.yml

多个驱动程序剧本。在某些情况下,开发人员可能会选择在不同的后端测试相同的角色。如果确定的驱动程序在提供者的dict的playbooks部分中有一个键,那么Molecule将选择特定于驱动程序的create/destroy playbooks。

重要

如果确定的驱动程序在playbooks dict中有一个键,Molecule将使用这个dict来解析所有配置playbooks(create/destroy)。

provisioner:
  name: ansible
  playbooks:
    docker:
      create: create.yml
      destroy: destroy.yml
    create: create.yml
    destroy: destroy.yml
    converge: converge.yml

重要

本节中的路径转换为绝对路径,其中相对父路径是$u目录。

副作用剧本执行对实例产生副作用的动作。用于测试HA故障转移场景等。默认情况下不启用。将以下内容添加到provisioner的 playbooks 要启用的节。

provisioner:
  name: ansible
  playbooks:
    side_effect: side_effect.yml

重要

这个特性应该被认为是实验性的。

prepare playbook执行动作,使系统在收敛之前达到给定的状态。它在创建之后执行,并且在实例生命周期内只执行一次。

这可用于在测试之前将实例置于特定状态。

provisioner:
  name: ansible
  playbooks:
    prepare: prepare.yml

cleanup playbook用于清理将被销毁的实例上可能不存在的测试基础结构。主要用例用于“清理”在Molecule测试环境之外所做的更改。例如,远程数据库连接或用户帐户。与…结合使用 prepare 在需要时修改外部资源。

清理步骤直接在每个销毁步骤之前执行。就像销毁步骤一样,它将运行两次。在收敛之前进行初始清理,然后在最后一步销毁之前进行清理。这意味着清理剧本必须处理清理尚未创建的资源的失败。

将以下内容添加到provisioner的 playbooks 要启用的节。

provisioner:
  name: ansible
  playbooks:
    cleanup: cleanup.yml

重要

这个特性应该被认为是实验性的。

环境变量。Molecule尽其所能处理常见的易变路径。默认值如下。

ANSIBLE_ROLES_PATH:
  $ephemeral_directory/roles/:$project_directory/../:~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles
ANSIBLE_LIBRARY:
  $ephemeral_directory/modules/:$project_directory/library/:~/.ansible/plugins/modules:/usr/share/ansible/plugins/modules
ANSIBLE_FILTER_PLUGINS:
  $ephemeral_directory/plugins/filter/:$project_directory/filter/plugins/:~/.ansible/plugins/filter:/usr/share/ansible/plugins/modules

环境变量可以传递给provisioner。本节中与上述名称匹配的变量将出现在上述默认值中,并转换为绝对路径,其中相对父路径是$u目录。

重要

本节中的路径转换为绝对路径,其中相对父路径是$u目录。

provisioner:
  name: ansible
  env:
    FOO: bar

修改ansible.cfg文件.

provisioner:
  name: ansible
  config_options:
    defaults:
      fact_caching: jsonfile
    ssh_connection:
      scp_if_ssh: True

重要

以下键是不允许的,以防止Molecule功能不正常。除了 privilege_escalation .

provisioner:
  name: ansible
  config_options:
    defaults:
      roles_path: /path/to/roles_path
      library: /path/to/library
      filter_plugins: /path/to/filter_plugins
    privilege_escalation: {}

需要主机/组设置某些变量的角色。Molecule使用相同的 variables defined in a playbook 语法为 Ansible .

provisioner:
  name: ansible
  inventory:
    group_vars:
      foo1:
        foo: bar
      foo2:
        foo: bar
        baz:
          qux: zzyzx
    host_vars:
      foo1-01:
        foo: bar

Molecule会根据下定义的主机自动生成清单 Platforms . 使用 hosts 键允许向库存中添加不受Molecule管理的额外主机。

一个典型的用例是,如果您想从清单中的另一个主机访问一些变量(使用hostvars),而不创建它。

注解

的内容 hosts 应该遵循基于YAML的清单语法:从 all 组并具有hosts/vars/children条目。

provisioner:
  name: ansible
  inventory:
    hosts:
      all:
        extra_host:
          foo: hello

重要

使用此密钥添加到资源清册的额外主机不会被Molecule创建/销毁。开发人员有责任在playbook中找到合适的主机。仅在下定义的主机 Platforms 应该瞄准而不是 all .

另一种方法是符号连接。Molecule创建指向清单目录中指定目录的符号链接。这使得ansible能够利用其内置的主机/组变量分辨率进行聚合。这两种库存管理形式是互斥的。

如上所述,可以使用 hosts 关键。 Ansible 将自动合并这个清单和Molecule生成的清单。如果您想定义不受Molecule管理的额外主机,这将非常有用。

重要

同样,开发人员有责任在playbook中找到合适的主机。仅在下定义的主机 Platforms 应该瞄准而不是 all .

注解

源目录链接相对于场景的目录。

唯一有效的密钥是 hostsgroup_varshost_vars . Molecule的模式验证器将强制执行此操作。

provisioner:
  name: ansible
  inventory:
    links:
      hosts: ../../../inventory/hosts
      group_vars: ../../../inventory/group_vars/
      host_vars: ../../../inventory/host_vars/

替代连接选项:

provisioner:
  name: ansible
  connection_options:
    ansible_ssh_user: foo
    ansible_ssh_common_args: -o IdentitiesOnly=no

运行converge时向ansible playbook添加参数:

provisioner:
  name: ansible
  ansible_args:
    - --inventory=mygroups.yml
    - --limit=host1,host2

初始化一个新的ansible类并返回None。

参数

config -- Molecule构型的实例。

返回

没有

脚本

Molecule将场景视为一级公民,使用顶级配置语法。

class molecule.scenario.Scenario

一个场景允许Molecule以特定的方式测试一个角色,这是从Moleculev1的根本变化。

场景是一个自包含的目录,其中包含以特定方式测试角色所需的所有内容。默认场景命名为 default ,并且每个角色都应该包含一个默认场景。

除非明确提及,否则场景名称将是承载文件的目录名。

本节中设置的任何选项都将覆盖默认值。

scenario:
  create_sequence:
    - dependency
    - create
    - prepare
  check_sequence:
    - dependency
    - cleanup
    - destroy
    - create
    - prepare
    - converge
    - check
    - destroy
  converge_sequence:
    - dependency
    - create
    - prepare
    - converge
  destroy_sequence:
    - dependency
    - cleanup
    - destroy
  test_sequence:
    - dependency
    - lint
    - cleanup
    - destroy
    - syntax
    - create
    - prepare
    - converge
    - idempotence
    - side_effect
    - verify
    - cleanup
    - destroy

初始化一个新的场景类并返回None。

参数

config -- Molecule构型的实例。

返回

没有

内部簿记机制。

class molecule.state.State

管理状态文件的类。

在一个给定的Molecule结构中用作一个单子。如果文件不存在,则将初始状态序列化到磁盘,否则将从现有状态文件反序列化。对对象所做的更改将立即序列化。

状态不是Molecule配置中的顶级选项。它的目的是记账,每一个 Config 对象具有对 State 对象。

注解

目前,它的用途明显小于它在v1Molecule中的用途。

初始化一个新的state类并返回None。

参数

config -- Molecule构型的实例。

返回

没有

验证者

Molecule通过调用可配置的验证器来处理角色测试。

Ansible

class molecule.verifier.ansible.Ansible

Ansible 是默认的测试验证器。

Molecule执行剧本 (verify.yml )位于角色的 scenario.directory .

verifier:
  name: ansible

可以通过设置 enabled 错了。

verifier:
  name: ansible
  enabled: False

环境变量可以传递给验证器。

verifier:
  name: ansible
  env:
    FOO: bar

初始化所有的代码 验证者 类。

参数

config -- Molecule构型的实例。

返回

没有

睾丸

class molecule.verifier.testinfra.Testinfra

Testinfra 不再是3.0版之后的默认测试验证器。

其他选项可以传递给 testinfra 本节中设置的任何选项都将覆盖默认值。

注解

Molecule将删除任何匹配的选项'^ [v] +$,然后通过 -vvv 到基础 pytest 执行时的命令 molecule --debug .

verifier:
  name: testinfra
  options:
    n: 1

可以通过设置 enabled 错了。

verifier:
  name: testinfra
  enabled: False

环境变量可以传递给验证器。

verifier:
  name: testinfra
  env:
    FOO: bar

更改测试目录的路径。

verifier:
  name: testinfra
  directory: /foo/bar/

来自与场景的tests目录相关的另一个文件或目录的附加测试(支持regexp)。

verifier:
  name: testinfra
  additional_files_or_dirs:
    - ../path/to/test_1.py
    - ../path/to/test_2.py
    - ../path/to/directory/*

设置要执行的需求 testinfra 不返回任何值。

参数

config -- Molecule构型的实例。

返回

没有