远程作业执行
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 中的相同。