2016-12-29 42 views
0

與Maven打包在遠程主機上我有一個劇本完成這個任務,其中包括:不能使用Ansible

- name: Compile and package 
    command: './mvnw clean package' 
    args: 
    chdir: "{{workdir}}" 

但我得到這個錯誤:如果我通過SSH訪問

FAILED! => {"changed": true, "cmd": "./mvnw clean package", "delta": "0:00:00.003895", "end": "2016-12-29 21:59:16.121501", "failed": true, "rc": 1, "start": "2016-12-29 21:59:16.117606", "stderr": "Error: JAVA_HOME is not defined correctly.\n We cannot execute ", "stdout": "", "stdout_lines": [], "warnings": []}

到遠程主機並執行相同的命令,它的工作原理。顯然,定義了JAVA_HOME,但似乎Ansible無法檢測到它。

回答

1

當它說JAVA_HOME未定義時,它可能意味着JAVA_HOME未定義。

首先,當您登錄時,您使用的是shell的交互模式/登錄shell,當您使用Ansible時,您正在使用shell的非交互模式。不同的rc文件被加載爲這兩個 - 參考man bashBash Startup Files的「調用」部分(它與其他shell類似,但我假設您使用的是Bash)。

如果JAVA_HOME變量賦值位於僅以交互模式運行的rc文件中,則會有差異。將定義移動到適當的位置。

其次,還取決於你在哪裏設置JAVA_HOME的地方 - 用shell模塊代替command可能加載正確的定義文件。


只要定義JAVA_HOMEenvironment這個任務,不依賴於隱含的夾雜物..

+0

謝謝!我現在理解BASH_ENV,非交互式shell。但是我必須在哪裏定義BASH_ENV? '環境'解決方案是有益的,但想象一下,在未來,每個主機上的JAVA_HOME是不同的...... –

+0

好吧,在/ etc/environment中加載非交互式。它的工作原理:)謝謝 –

+0

您正在使用聲明性模型,因此應定義您的配置(並且擁有一個已知和適當的Java版本,在這種情況下必須具有正確的環境變量),而不是依賴未知狀態「 *每臺主機不同*「。 – techraf