Ansible无法识别mvn命令,但已安装Maven

时间:2019-06-19 18:49:06

标签: linux maven ansible

我正在尝试从Ansible Tower运行一个Maven项目,但是Ansible kepps给我一个“ mvn:无法识别的命令”错误,如果我从Linux服务器上的命令行手动进行操作,则mvn可以很好地运行

我在尝试从Ansible运行Gradle时遇到类似的问题,但是该解决方案在这里不起作用。以前的问题是,我在运行剧本时需要设置env变量。我在这里尝试过,但无济于事。我检查了路径,可以在那看到Maven路径。

我接受了Zeitounator的建议,并尝试使用绝对路径从Ansible拨打电话,并且行得通。但是,正如他所说,这只是一个测试,而不是实际的解决方案。

  • 我将/ bin添加到PATH中,因为以前某些情况下缺少它 原因
  • 我尝试在服务器和Ansible剧本中都将MAVEN_HOME更改为/ opt / maven / bin /
  • 我确保M2_HOME变量为空,因为我读到它在那里可能会引起一些问题

似乎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"

1 个答案:

答案 0 :(得分:1)

您正使用 bash shell在服务器上直接启动上述测试命令。

Ansible shell模块默认使用 sh 外壳程序(请参阅documentation

我必须在这里进行猜测,但是我有99.9%的把握确保将maven bin路径添加到了bash特定的初始化文件中的PATH变量中,因此在使用sh时它不可用。

您现在有2个解决方案:

  1. 更改声明PATH的方式,以便bash和sh都选择该值。对于系统范围的设置,可以使用/etc/profile。对于特定用户,使用~/.profile应该可以解决问题。
  2. 更改ansible用于bash的外壳,以使您处于完全相同的情况
- 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