我很难理解 Ansible 的整体远程行为。
我指的是所有 ansible.builtin.command 和 ansible.builting.shell 模块。
似乎不会收集放置在后台并被拒绝的脚本的任何输出。
它似乎无法正确地拒绝作业(尽管
nohup
似乎工作得很好,除了重定向之外——所以仍然存在丢失整个后台作业输出的问题)。
我想在多台远程计算机上安装 python 模板化脚本,运行它并与 Ansible 的连接分离,以便它在后台运行(因为它是在 TCP 端口上侦听的阻塞调用)。 python 脚本是几个导入、打印语句,然后调用
server.start()
,这是 TCP 端口上的阻塞监听。
我写了这个任务:
- name: start services # not working clearly
ansible.builtin.shell:
executable: /bin/bash
cmd: |
python3 <<-'EOF' &
{{ lookup("ansible.builtin.template", "../scripts/server_start.tmpl", template_vars={"service": item}) }}
EOF
disown -h %1
loop: "{{hostvars[inventory_hostname].services}}"
这根本不起作用,如:
有人能对此给出一些合乎逻辑的解释吗?我在本地测试过,效果符合预期。 我什至通过运行
/bin/bash -c 'python3 <<-'EOF' ...'
在本地测试了脚本,我想这就是 ansible 执行它的方式。我什至通过 SSH 测试过它并且仍然有效。 Ansible 会丢失输出并且没有正确地否认这项工作,这是怎么回事?
顺便说一句,如果我省略阻塞
server.start()
调用,Ansible 会正确捕获输出。我已将 server.start()
呼叫替换为长 sleep()
,但它也不起作用。
问:“Ansible 会丢失输出并且无法正确完成工作吗?...任何人都可以对此给出一些合乎逻辑的解释吗?
”在这种情况下所做的假设似乎并不正确。
Ansible 是如何工作的?我指的是所有
disown
和模块。 这些模块没有像 SSH 会话中那样被称为远程或交互式 shell。请参阅ansible.builtin.command
模块介绍似乎没有收集放置在后台并被拒绝的脚本的任何输出。
是的,这似乎是这里的预期行为。根据
和返回值
Ansible 通常在远程受管节点上执行每个模块,并收集返回值。和
Ansible 模块通常返回一个可以注册到变量中的数据结构...因此这种行为不会被实施。还有关于
它似乎正确失败了
ansible.builting.shell
作业(尽管除了重定向之外似乎工作得很好 - 所以仍然存在丢失整个后台作业输出的问题) 您还可能会看到disown
nohup
和
disown
之间的 区别是什么。正如评论中已经提到的,唯一的可能是同时运行:
对于长时间运行的任务。
如果您想同时运行 playbook 中的多个任务,请使用无法同时注册
poll = 0
并将设置为 0。当您设置async
时,Ansible 会启动任务并立即转到下一个任务,而无需等待结果. 但是,poll
poll: 0
和
job_id
。进一步阅读
这可能有助于理解这个问题
。 Ansible 版本之间似乎再次出现问题,导致在终止远程连接时杀死所有子进程。 这似乎解答了我大部分的疑问。 我已经更改了任务以使用
rc
和 python 脚本来使用带有文件处理程序的记录器(正如我在原始帖子中提到的,脚本的 stdout 重定向不起作用[不幸的是,我仍然不理解这种行为] ).