配置¶
-
class
molecule.config.
Config
¶ 配置类。
Molecule在当前目录中搜索
molecule.yml
globbing提供的文件 molecule/*/molecule.yml . 这些文件被实例化为一个Molecule列表Config
对象,并且每个Molecule子命令对该列表进行操作。文件所在的目录
molecule.yml
是场景的目录。Molecule在这个目录中执行大多数功能。这个
Config
对象实例化 Dependency, Driver, Lint , Platforms, Provisioner, Verifier, 脚本 和 State 参考文献。初始化一个新的配置类并返回None。
- 参数
molecule_file -- 包含要分析的Molecule文件路径的字符串。
args -- CLI中选项、参数和命令的可选dict。
command_args -- 从CLI传递给子命令的可选选项dict。
ansible_args -- 提供给
ansible-playbook
命令。
- 返回
没有
预运行¶
为了帮助Ansible找到使用的模块和角色,Molecle将执行一组预先运行的操作。这些操作涉及从以下位置安装依赖项 requirements.yml
在项目级别指定,请安装独立角色或集合。目的地是 project_dir/.cache
并且代码本身是从Ansible-lint重用的,它必须执行相同的操作。
这确保了当您在分子攻略中包含一个角色时,Ansible将能够找到该角色,并且包含的内容与您期望在生产中使用的完全相同。
如果由于某种原因预运行操作不符合您的需要,您仍然可以通过添加 prerun: false 在配置文件内部。
请记住,您可以将此值添加到 .config/molecule/config.yml
文件,以避免将其添加到每个方案中。
变量替换¶
-
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 |
生成目录的路径,通常是 |
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-file
和requirements-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-notest 或 notest . 带标签的 molecule-idempotence-notest 仅在幂等操作步骤中跳过任务。
重要
保留“创建和销毁剧本”以进行资源调配。不要试图收集事实或在这些剧本中的配置节点上执行操作。由于需要体操同步状态之间的Ansible和Molecule,它是最好的执行这些任务的准备或会聚剧本。
开发人员有责任将模块的事实数据正确映射到Create剧本中的INSTANCE_CONF_DICT事实中。这使得分子能够正确地配置可拆分的库存。
其他选项可以传递给
ansible-playbook
本节中设置的任何选项都将覆盖默认值。重要
选项不影响创建和销毁操作。
注解
Molecule将删除任何匹配的选项'^ [v] +$,然后通过
-vvv
到基础ansible-playbook
执行时的命令 molecule --debug .除非用
--debug
旗帜。但是,这会产生相当多的输出。要启用Ansible日志输出,请将以下内容添加到provisioner
截面molecule.yml
.provisioner: name: ansible log: True
Docker和Podman的创建/销毁剧本与Molecule捆绑在一起。这些剧本有一个来自 molecule.yml ,和是最常用的。捆绑的剧本仍然可以被覆盖。
剧本加载顺序为:
provisioner.playbooks.$driver_name.$action
provisioner.playbooks.$action
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
可以将环境变量传递给置备程序。本节中与上述名称匹配的变量将附加到上述缺省值之后,并转换为绝对路径,其中相对父级为$SCENPACTION_DIRECTORY。
重要
本节中的路径转换为绝对路径,其中相对父路径是$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
重要
分子不会创建/销毁使用此密钥添加到清单中的额外主机。开发人员有责任在行动手册中针对适当的主机。仅在下定义的主机 Platforms 应该成为目标,而不是
all
。另一种方法是符号连接。Molecule创建指向清单目录中指定目录的符号链接。这使得ansible能够利用其内置的主机/组变量分辨率进行聚合。这两种库存管理形式是互斥的。
如上所述,可以使用
hosts
关键。 Ansible 将自动合并这个清单和Molecule生成的清单。如果您想定义不受Molecule管理的额外主机,这将非常有用。重要
同样,开发人员有责任在攻略中针对适当的主机。仅在下定义的主机 Platforms 应该成为目标,而不是
all
。注解
源目录链接相对于场景的目录。
唯一有效的密钥是
hosts
,group_vars
和host_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构型的实例。
- 返回
没有
州¶
内部簿记机制。
验证者¶
Molecule通过调用可配置的验证器来处理角色测试。
Ansible¶
睾丸¶
-
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构型的实例。
- 返回
没有