Ansible命令,Shell模块无法执行脚本

4

我有一个名为tomcat.sh的文件,它的目的是在部署到远程主机后重新启动(停止和启动)tomcat。

我注意到Shell和Command模块没有执行.sh文件。但是,作为远程用户,我可以在远程主机上手动执行.sh文件。

下面列出了Playbook任务:

Shell

- name: ensures tomcat is restarted
  shell:
   "nohup {{tomcat_dir}}/apache-tomcat-{{tomcat_version}}/tomcat.sh &"

命令

- name: ensures tomcat is restarted test-test
  command: ./tomcat.sh
  args:
    chdir: "{{tomcat_dir}}/apache-tomcat-{{tomcat_version}}"

你是否使用相同的远程用户执行带或不带 Ansible 的脚本?你是否从 Ansible 收到任何错误消息?如果脚本仅重新启动 tomcat,为什么要将其发送到后台? - udondan
执行脚本时没有出现任何错误。nohup 没有特别的原因,我只是习惯将进程发送到后台,但它不应该影响底层 shell 命令。相反,我为命令任务留下了它。 - Gary Lam
2个回答

2
我也遇到了同样的问题。我有一个简单的脚本,用于启动一个java程序。shell 和command模块表现非常不稳定。有时候java程序能够成功启动,但有时候却什么也不发生。尽管ansible rc状态显示为0(即成功的退出代码)。我甚至在我的脚本中放置了echo“Hello” >> output.log作为第一行,以检查脚本是否被选中运行。但是,即使这个语句没有打印输出,也没有任何错误信息被打印出来,而ansible模块的退出状态(rc)为0。此外,请确保查看stderr。有时候,即使rc可能是0,但是stderr中可能会有一些信息。
经过很多头发梳理,我最终找到了解决办法。我以“sudo”的身份运行java程序。我从我的脚本中删除了sudo,并将其作为playbook中的“become”指令 - http://docs.ansible.com/ansible/become.html。该指令仅从ansible 2.0开始提供,因此我必须将我的ansible从1.5升级到2.0。最终,我的playbook如下:
- name: Execute run.sh
    become: true 
    script: /home/vagrant/deploy/target/scripts/run.sh

脚本看起来像这样:
nohup java -Djava.net.preferIPv4Stack=true -Xms1048m -Xmx1048m -cp /x/y/z/1.jar com.github.binitabharati.x.Main >> output.log 2>&1 &

另外,请注意我没有使用commandshell模块,而是使用了script模块。

0

{{tomcat_dir}} 的值是否以“/”开头?如果不是,则它将尝试使用相对于 Ansible 用于 SSH 登录到远程主机的任何用户的主目录指定路径来执行命令。

顺便说一下,如果您通过软件包管理器安装,则可能会更容易?

- name: restart tomcat
  become: yes
  become_user: sudo
  service: name=tomcat state=restarted

关于“服务”模块的更多详细信息在这里

当然,服务名称可能不同,例如tomcat6或tomcat7或其他,但我希望你能理解。

最后,如果您使用来自Galaxy或GitHub的角色通过Ansible安装了Tomcat,则您的角色可能具有处理程序,您可以复制以完成此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接