我有一个tomcat.sh,其目的是在将tomcat部署到远程主机后重新启动(停止和启动)它。
我注意到Shell和Command模块没有执行.sh文件。但是,我能够在远程主机上手动执行.sh文件作为远程用户。
Playbook任务如下:
贝壳
- 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}}"
答案 0 :(得分:1)
我遇到了同样的问题。我有我的简单脚本应该启动一个java程序。 shell和命令模块工作非常不稳定。有时java程序成功启动,有时没有任何反应。即使ansible rc状态显示为0(这是成功的退出代码)。我甚至把回声“你好”>> output.log作为我脚本中的第一行,用于检查脚本是否实际被选中以进行运行。但是,即使这样也不会被打印出来。但是,没有任何错误被打印出来,并且ansible模块退出状态(rc)为0.此外,请务必同时查看stderr
。有时,即使rc
可能为0,但stderr
经过大量的头发撕裂,我可以设法解决我的问题。我正在运行java程序作为“sudo”。我从我的脚本中删除了sudo,并将其作为“成为”指令放在playbook中 - http://docs.ansible.com/ansible/become.html。该指令仅从ansible 2.0开始提供,因此我必须将我的ansible从1.5升级到2.0。我的剧本终于看起来像这样了
- 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 &
另请注意,我没有使用command
或shell
模块,而是使用了script
模块。
答案 1 :(得分:0)
{{tomcat_dir}}的值是否以" /"?开头?如果没有,那么它将尝试使用指向相对于使用ssh进入远程主机的用户ansible的主目录的路径来执行命令。
顺便说一句,如果您通过包管理器安装,这可能会更容易?
- name: restart tomcat
become: yes
become_user: sudo
service: name=tomcat state=restarted
关于"服务的更多细节"模块here
当然,服务名称可能会有所不同,比如tomcat6或tomcat7或者其他什么,但是我希望你能得到这个要点。
最后,如果您使用galaxy或github中的角色通过ansible安装了tomcat,那么您的角色可能会拥有可以复制的处理程序来完成此操作。