远程作业执行

Ansible Runner 支持在一个主机上请求作业运行,但在另一个主机上执行的概念。此功能主要供 Receptor 使用。

Runner 中对此的支持涉及一个三阶段过程。

  • 传输:将作业转换为可以发送到工作节点的二进制格式。

  • 工作节点:实际执行作业。

  • 处理:接收作业结果并进行处理。

以下命令说明了这三个阶段如何协同工作

$ ansible-runner transmit ./demo -p test.yml | ansible-runner worker | ansible-runner process ./demo

在此示例中,ansible-runner transmit 命令被赋予了一个私有数据目录 ./demo,并被告知从中选择 test.yml 剧本。与 ansible-runner run 执行剧本的方式不同,数据目录和命令行参数被转换为压缩的二进制流,并作为标准输出发出。 transmit 命令通常采用与 run 命令相同的命令行参数。

ansible-runner worker 命令接受此流,运行剧本,并生成一个新的压缩二进制流,其中包含生成的作业事件和工件。此命令可以选择接受 --private-data-dir 选项。如果提供,它将把从 ansible-runner transmit 发送的内容提取到该目录中。

ansible-runner process 命令接受来自工作节点的结果流,并触发所有正常的回调并执行作业事件处理。在上面的命令中,这将导致打印剧本输出并将工件保存到数据目录中。 process 命令将数据目录作为参数,以便知道将工件保存到哪里。

使用 Receptor 作为远程执行器

关于 Receptor 如何工作的完整扩展超出了本文档的范围。我们可以使用简单的配置文件设置一个基本的 Receptor 节点

---
- node:
    id: primary

- log-level:
    level: Debug

- local-only:

- control-service:
    service: control
    filename: ./control.sock

- work-command:
    worktype: ansible-runner
    command: ansible-runner
    params: worker
    allowruntimeparams: true

然后,我们可以启动该本地 Receptor 节点

$ receptor --config ./receptor.yml

现在,我们可以重复上述 transmit/worker/process 示例,但是,而不是将 transmit 的输出传递给 worker,我们可以使用 receptorctl 命令将其发送到我们刚刚启动的 Receptor 节点

$ ansible-runner transmit ./demo -p test.yml | receptorctl --socket ./control.sock work submit -f --node primary -p - ansible-runner | ansible-runner process ./demo

清理作业使用的资源

transmit 和 process 命令不提供任何自动删除私有数据目录或工件的功能,因为这些是用户与 Runner 交互的方式。

在运行 ansible-runner worker 时,如果没有给出 --private-data-dir,它将把内容提取到一个临时目录中,该目录在执行结束时将被删除。如果给出了 --private-data-dir 选项,则该目录在运行结束后将保留,除非还设置了 --delete 标志。在这种情况下,如果私有数据目录存在,则在执行之前将其删除,并在执行后将其删除。

以下命令提供了带外清理

$ ansible-runner worker cleanup --file-pattern=/tmp/foo_*

这将确保删除符合文件通配符 /tmp/foo_* 的旧目录,这可以用来确保清理像 ansible-runner worker --private_data_dir=/tmp/foo_3 这样的命令创建的路径。注意:请参阅 --grace-period 选项,它设置时间窗口。

此命令还带有一个 --remove-images 选项来运行 podman 或 docker 的 rmi 命令。否则,即使使用 container_auth_data 从私有容器注册表中提取,也不会自动清理运行使用的镜像。为了确保也删除了层,需要使用 --image-prune 标志。

工件目录规范

worker 命令不会写入工件,而是对其进行流式传输,而 process 命令最终会写入工件文件夹的内容。

使用默认行为, ansible-runner process ./demo 会将工件写入 ./demo/artifacts。如果您希望更好地与正常的 ansible-runner 使用保持一致,您可以传递 --ident 选项以保存到子文件夹中,因此 ansible-runner process ./demo --ident=43 会将工件提取到文件夹 ./demo/artifacts/43 中。

Python API

导入 Ansible Runner 的 Python 代码可以通过将 streamer 参数设置为 ansible_runner.interface.run 来使用这些功能。此参数可以设置为 transmitworkerprocess 以调用三个阶段中的每一个。其他参数与 CLI 中的相同。