2016-02-05 452 views
1

我有一個tomcat.sh,其目的是在將它部署到遠程主機上後重新啓動(停止並啓動)tomcat。Ansible命令,Shell模塊不執行腳本

我注意到Shell和Command模塊沒有執行.sh文件。但是,我能夠以遠程用戶的身份在遠程主機上手動執行.sh文件。

的劇本任務列表如下:

殼牌

- 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

您是否正在使用與Ansible相同的遠程用戶執行腳本?你從Ansible收到任何錯誤消息嗎?如果腳本只重新啓動tomcat,爲什麼要將它發送到後臺? – udondan

+0

執行腳本時沒有錯誤。沒有特別的理由把nohup。我只是習慣於在後臺發送進程,但不應該影響底層的shell命令。相反,我把它留給了命令任務。 –

回答

0

是否值{{TOMCAT_DIR}}開始用 「​​/」 ?如果不是,那麼它將嘗試使用指定的路徑執行命令,該路徑相對於任何用戶使用ssh登錄到遠程主機的主目錄。

順便說一句,如果你通過包管理器安裝,這可能會更容易?

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

更多細節「服務」模塊here

當然上,服務名稱可能不同,比如tomcat6中或tomcat7或什麼的,但你的要點,我希望。

最後,如果您是通過使用galaxy或github中的某個角色安裝tomcat,則您的角色可能會有一些處理程序可以複製以完成此操作。

0

我遇到了同樣的問題。我有我的簡單腳本,應該啓動一個Java程序。外殼和命令模塊工作非常不正常。有時候java程序會成功啓動,有時甚至沒有任何反應。即使rc狀態顯示爲0(這是成功的退出代碼)。我甚至在我的腳本中放置了一個echo「Hello」>> output.log作爲第一行,以檢查腳本是否真的被選中用於運行。但是,即使這樣也沒有打印出來。但是,無論打印出什麼錯誤,模塊退出狀態(rc)都是0,並且也一定要看stderr。有時,即使rc可能爲0,但可能有一些信息stderr

經過大量的頭髮撕裂,我可以設法解決我的問題。我正在將java程序作爲「sudo」運行。我從腳本中刪除了sudo,並將其作爲「成爲」指令放在劇本中 - http://docs.ansible.com/ansible/become.html。該指令僅適用於2.0以上版本,所以我必須將我的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 & 

而且,我沒有用過commandshell模塊的通知,而不是我用script模塊。