linux - Ansible 无法识别 mvn 命令,但安装了 Maven
问题描述
我正在尝试从 Ansible Tower 运行一个 maven 项目,但是 Ansible kepps 给了我一个“mvn:无法识别的命令”错误,如果我从 Linux 服务器上的命令行手动执行,mvn 运行良好
我在尝试从 Ansible 运行 Gradle 时遇到了类似的问题,但是解决方案在这里不起作用。以前,问题是我在运行剧本时需要设置环境变量。我在这里尝试过,但无济于事。我检查了我的路径,可以在那里看到 Maven 路径。
我接受了 Zeitounator 的建议,并尝试使用绝对路径从 Ansible 进行调用,并且成功了。但是,正如他所提到的,这只是一个测试,而不是一个实际的解决方案。
- 我将 /bin 添加到 PATH 中,因为它以前因某种原因丢失
- 我尝试在服务器和 Ansible 剧本中将 MAVEN_HOME 更改为 /opt/maven/bin/
- 我确保 M2_HOME 变量是空白的,因为我读到它可能会导致一些问题,如果它在那里
似乎 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"
解决方案
您正在使用bash shell直接在服务器上启动上面的测试命令。
Ansibleshell
模块默认使用sh shell(参见文档)
我必须在这里猜测一下,但我 99.9% 确定 maven bin 路径已添加到PATH
bash 特定初始化文件中的变量中,因此当您使用 sh 时它不可用。
您现在有 2 个解决方案:
- 更改您声明的方式,
PATH
以便 bash 和 sh 选择值。对于系统范围的设置,您可以使用/etc/profile
. 对于特定用户,使用~/.profile
应该可以解决问题。 - 更改 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
推荐阅读
- flutter - 如何在颤动日历中获取选定日期的键
- python - 使用 pygraphviz_layout 时出现“KeyError:节点不在图中”,即使节点在 networkx 图中
- spring-boot - 如何关闭springboot默认file-appender.xml?
- umbraco - 将不同的域分配给一个 Umbraco 实例中的不同节点
- android - 通知进度条在更新 Android 时发出声音
- c# - 如何从父视图自定义子视图?
- oracle - 如何通过 Commad 行在已经运行的 toad 中打开新的 toad 会话?
- c - 为什么 Visual Studio Code 默认不支持 C 样式格式?
- django - 如何修复 gunicorn.service:无法加载环境
- moodle - 指示所需参数的使用核心 Web 服务功能的 Moodle 文档在哪里