ansible.builtin.shell 无法使用拒绝和奇怪的输出重定向

问题描述 投票:0回答:2

我很难理解 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}}"

这根本不起作用,如:

  • 我的 python 脚本的输出(任何 print() 语句)永远不会被 ansible 捕获——尽管我认为在调用 disown 之后只有 stdin 被分离,
  • 脚本与 Ansible 进程一起被杀死——它不会保留在远程机器上

有人能对此给出一些合乎逻辑的解释吗?我在本地测试过,效果符合预期。 我什至通过运行

/bin/bash -c 'python3 <<-'EOF' ...'
在本地测试了脚本,我想这就是 ansible 执行它的方式。我什至通过 SSH 测试过它并且仍然有效。 Ansible 会丢失输出并且没有正确地否认这项工作,这是怎么回事?

顺便说一句,如果我省略阻塞

server.start()
调用,Ansible 会正确捕获输出。我已将
server.start()
呼叫替换为长
sleep()
,但它也不起作用。

python-3.x bash ssh ansible remote-server
2个回答
0
投票

了解 Ansible 的整体远程行为

问:“Ansible 会丢失输出并且无法正确完成工作吗?...任何人都可以对此给出一些合乎逻辑的解释吗?

在这种情况下所做的假设似乎并不正确。

我指的是所有 disown

ansible.builtin.command
模块。

这些模块没有像 SSH 会话中那样被称为远程或交互式 shell。请参阅
Ansible 是如何工作的?

似乎没有收集放置在后台并被拒绝的脚本的任何输出。

是的,这似乎是这里的预期行为。根据
模块介绍

返回值

Ansible 通常在远程受管节点上执行每个模块,并收集返回值。

Ansible 模块通常返回一个可以注册到变量中的数据结构...

因此这种行为不会被实施。还有关于

它似乎正确失败了ansible.builting.shell作业(尽管

disown
除了重定向之外似乎工作得很好 - 所以仍然存在丢失整个后台作业输出的问题)

您还可能会看到
nohup

nohup

disown
 之间的 
 区别是什么。
正如评论中已经提到的,唯一的可能是

同时运行:

&

对于长时间运行的任务。

如果您想同时运行 playbook 中的多个任务,请使用

poll = 0 并将

async
设置为 0。当您设置
poll
时,Ansible 会启动任务并立即转到下一个任务,而无需等待结果.

但是,
无法同时注册

poll: 0

job_id

进一步阅读

这可能有助于理解这个问题

    如何获取正在运行的 Ansible play 的输出?

0
投票
https://github.com/ansible/ansible/issues/33410

。 Ansible 版本之间似乎再次出现问题,导致在终止远程连接时杀死所有子进程。 这似乎解答了我大部分的疑问。 我已经更改了任务以使用

rc

和 python 脚本来使用带有文件处理程序的记录器(正如我在原始帖子中提到的,脚本的 stdout 重定向不起作用[不幸的是,我仍然不理解这种行为] ).

    
© www.soinside.com 2019 - 2024. All rights reserved.