远程作业执行

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 中的参数相同。