首页 > 解决方案 > Ansible 无法识别 mvn 命令,但安装了 Maven

问题描述

我正在尝试从 Ansible Tower 运行一个 maven 项目,但是 Ansible kepps 给了我一个“mvn:无法识别的命令”错误,如果我从 Linux 服务器上的命令行手动执行,mvn 运行良好

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

我接受了 Zeitounator 的建议,并尝试使用绝对路径从 Ansible 进行调用,并且成功了。但是,正如他所提到的,这只是一个测试,而不是一个实际的解决方案。

似乎 Ansible 不知道在哪里寻找 Maven,我也不确定如何将这些信息传达给它。我觉得这是 Ansible 的一个愚蠢的怪癖,它有愚蠢的简单解决方案,如果我有除“mvn: command not found”以外的任何东西可以使用,那么可以解决这个问题。

这是我的剧本中的电话:

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

标签: linuxmavenansible

解决方案


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

Ansibleshell模块默认使用sh shell(参见文档

我必须在这里猜测一下,但我 99.9% 确定 maven bin 路径已添加到PATHbash 特定初始化文件中的变量中,因此当您使用 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

推荐阅读