远程作业执行
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
来利用这些功能。此参数可以设置为 transmit
、worker
或 process
来调用三个阶段中的每一个。其他参数与 CLI 中的参数相同。