决策环境

注意

本节中的某些示例引用了存储在集合(collections)中的 Rulebooks。如果您有兴趣将您的事件驱动自动化打包在集合中,请参阅 Rulebook 与集合 章节。

决策环境(Decision Environments)是专门为运行 Ansible Rulebook 任务而定制的 执行环境(Execution Environments)。它们是容器镜像,用于启动和运行 rulebook 进程,并包含运行 rulebook 所需的所有依赖项、集合和配置。

仓库根目录下包含了一个基础且最小化的 decision_environment。这是构建您自己的环境的一个良好起点。

ansible-builder build -f minimal-decision-environment.yml -t minimal-decision-environment:latest

这将构建一个名为 minimal-decision-environment:latest 的容器镜像,可用作您自定义决策环境的基础。

让我们使用此决策环境运行一个 rulebook,首先确保我们有一个包含 localhost 的本地清单(inventory)供我们使用。

echo "localhost ansible_connection=local" > inventory

现在,让我们使用此决策环境运行一个 rulebook。

docker run -it --rm -v ./inventory:/tmp/inventory ansible-execution-env:latest ansible-rulebook -r ansible.eda.hello_events -i /tmp/inventory

在决策环境中使用您自己的 rulebooks 和项目

最小化决策环境是一个良好的起点,但您可能希望将自己的 rulebooks 和项目添加到其中。

注意

请参阅 Ansible Builder 执行环境定义,了解如何向决策环境添加集合和依赖项的详细信息。

---
version: 3

images:
    base_image:
        name: 'minimal-decision-environment:latest'
dependencies:
    python:
        - pywinrm
    system:
        - iputils [platform:rpm]
    galaxy:
        collections:
            - name: my_namespace.my_awesome_collection
            - name: community.windows
            - name: ansible.utils
              version: 2.10.1

这是一个示例,其中您可能拥有一个包含 rulebooks 和 playbooks 的自定义集合,但需要将它们与其他一些集合以及某些 Python 和系统依赖项结合在一起。

您还可以使用 Builder,通过 additional-build-steps 将您自己的 rulebooks 和 playbooks 添加到决策环境中,然后利用 Containerfile 的 ADD 或 COPY 命令将文件导入环境。

---
version: 3

images:
    base_image:
        name: 'minimal-decision-environment:latest'
dependencies:
    python:
        - pywinrm
    system:
        - iputils [platform:rpm]
    galaxy:
        collections:
            - name: community.windows
            - name: ansible.utils
              version: 2.10.1
additional_build_steps:
    prepend_builder:
        - 'RUN mkdir -p /opt/ansible/my_rulebooks'
        - 'COPY my_rulebook.yml /opt/ansible/my_rulebooks'

注意

container_init.cmd 是一个可选的覆盖项,可用于覆盖容器启动时运行的默认命令。如果您想在无需提供完整命令行参数的情况下运行 playbook 或 rulebook,这非常有用。在运行时,仍可以通过向容器传递命令来覆盖它。