我正在尝试从Ansible Tower运行一个Maven项目,但是Ansible kepps给我一个“ mvn:无法识别的命令”错误,如果我从Linux服务器上的命令行手动进行操作,则mvn可以很好地运行
我在尝试从Ansible运行Gradle时遇到类似的问题,但是该解决方案在这里不起作用。以前的问题是,我在运行剧本时需要设置env变量。我在这里尝试过,但无济于事。我检查了路径,可以在那看到Maven路径。
我接受了Zeitounator的建议,并尝试使用绝对路径从Ansible拨打电话,并且行得通。但是,正如他所说,这只是一个测试,而不是实际的解决方案。
似乎Ansible不知道在哪里寻找Maven,而且我不确定如何将信息传达给它。我觉得这是Ansible的一个愚蠢的怪癖,它有愚蠢的简单解决方案,如果我可以使用“ mvn:找不到命令”以外的任何东西,则可以解决该问题。
这是我的剧本打来的电话:
- name: test mvn
shell: mvn -version
args:
chdir: /opt/jenkins/batchtest/
environment:
MAVEN_HOME: /opt/maven/
JAVA_HOME: /usr/java/jdk1.8.0_162
这是获取PATH的结果:
-bash-4.2$ echo $PATH
/bin:/usr/lib64/qt-3.3/bin:/opt/maven/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
这是mvn -version的输出,以防万一我想念这里
-bash-4.2$ mvn -version
Apache Maven 3.5.3 (3383c37e1f9e9b3bc3df5050c29c8aff9f295297; 2018-02-24T13:49:05-06:00)
Maven home: /opt/maven
Java version: 1.8.0_202, vendor: Oracle Corporation
Java home: /usr/java/jre1.8.0_202-amd64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-957.12.1.el7.x86_64", arch: "amd64", family: "unix"
答案 0 :(得分:1)
您正使用 bash shell在服务器上直接启动上述测试命令。
Ansible shell
模块默认使用 sh 外壳程序(请参阅documentation)
我必须在这里进行猜测,但是我有99.9%的把握确保将maven bin路径添加到了bash特定的初始化文件中的PATH
变量中,因此在使用sh时它不可用。
您现在有2个解决方案:
PATH
的方式,以便bash和sh都选择该值。对于系统范围的设置,可以使用/etc/profile
。对于特定用户,使用~/.profile
应该可以解决问题。- name: test mvn
shell: mvn -version
args:
chdir: /opt/jenkins/batchtest/
executable: /bin/bash
environment:
MAVEN_HOME: /opt/maven/
JAVA_HOME: /usr/java/jdk1.8.0_162