【问题标题】:Ansible return statusAnsible 返回状态
【发布时间】:2015-10-19 11:43:14
【问题描述】:

我有一个 ansible playbook,它部署了一个 jboss eap 实例以及其他一些东西。该剧本运行良好,直到使用提供的standalone.sh 脚本启动jboss。我正在使用 shell 模块来启动这个脚本,它在 jboss 启动时工作正常,但是当任务执行时,ansible 不会返回任何状态消息,如已更改或 OK,并且似乎挂起。

有没有办法强制 ansible 将其视为改变系统状态的东西?

【问题讨论】:

  • 您可以在详细模式下运行 playbook -vvvv
  • 是的,我知道这并没有真正给我足够的继续。问题是正在执行的脚本没有进行任何系统状态更改,因此 ansible 没有响应并且只是挂起

标签: jboss ansible


【解决方案1】:

我个人不使用 jboss,但这听起来像是 startup.sh 脚本根本没有在后台启动 jboss,所以 ansible 只是在等待它结束而它永远不会。

有几种可能的方法可以解决这个问题。鉴于this thread 中的信息,您可能想尝试这样的任务:

- name: start jboss
  shell: nohup standalone.sh > /dev/null
  async: True
  poll: 0

poll: 0 告诉 Ansible '触发并忘记'命令。如果你不包括这个,那么 Ansible 会在它从远程服务器返回时终止该进程。

另一种可能性是使用初始化脚本。我在上面链接的线程指向您应该能够找到初始化脚本的位置。您可以安装它(如果您不希望 jboss 在系统重新启动时启动,则将其禁用),然后只需通过 Ansible 中的 service 命令运行它:

- name: start jboss
  service: name=jboss state=started

编辑:如果您不愿意或无法使用 nohup 或将 jboss 置于后台的 init 脚本,那么另一种选择是使用 screen(如果您已安装并可用)。从 Ansible 调用长时间运行的命令时,我经常这样做,以便在 playbook 运行后检查命令的状态:

- name: Invoke long running command
  command: /usr/bin/screen -d -m /path/to/my/command
  async: True
  poll: 0

这将启动一个分离的屏幕会话并在其中调用您的命令。 Ansible 会立即忘记它,让命令自行运行。

【讨论】:

  • 谢谢,但是脚本运行正常。当它通过 ansible 任务执行时,它只是挂起(JBoss 启动正常,但 ansible 任务挂起)。运行脚本时,它会将一堆信息转储到控制台,所以我认为发生的事情是 Ansible 没有返回任何类型的状态,因此保持任务打开......通常在运行脚本或命令时,它会返回 OK , Changed 等,取决于它是否改变了系统的状态。在这种情况下,因为脚本只是将输出负载转储到屏幕上,所以可以说没有状态变化。
  • 您说脚本将一堆输出转储到屏幕上。它是否曾经返回到命令提示符而无需您执行任何操作(例如击键)?
  • 没什么,它本质上只是一个启动 JBoss 的脚本,它会通过一堆 xml 文件检查一切是否到位。在启动 JVM 等之前大约需要 20 秒左右...我尝试将 async 设置为 20 秒,这工作正常,但此后似乎会杀死 Java ( JBoss ) 进程...
  • 如果它没有返回到命令提示符,那么它就在前台运行,所以就像我在回答中概述的那样。您需要以将其置于后台的方式启动 jboss,否则控制权将永远不会返回到 Ansible。这就像您自己手动调用ssh remote-host /path/to/standalone.sh 一样。如果standalone.sh 在前台运行,ssh 调用将不会返回。 Ansible 本质上是在做同样的事情。您需要重写standalone.sh 以将jboss 启动到后台,使用nohup 或使用init 脚本。
猜你喜欢
  • 1970-01-01
  • 2014-06-09
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多