如何用Ansible获取指定路径下Java命令的版本输出?
解决Ansible获取特定路径Java版本返回空的问题
可能的原因及对应解决方案
1. 确认JDK路径准确性
先在目标主机上执行ls -l /usr/java/jdk-1.8/bin/java,检查该路径下的Java可执行文件是否存在。如果文件不存在,说明路径错误,需要修正为实际JDK路径(比如可能是/usr/java/jdk1.8.0_291/bin/java这类带具体小版本的路径)。
2. 适配JDK版本的输出格式
不同JDK发行版的java -version输出格式可能存在细微差异,原awk命令的匹配规则可能不兼容。可以修改命令,让匹配逻辑更通用:
- name: Fetch Java version from location shell: /usr/java/jdk-1.8/bin/java -version 2>&1 | awk '/version/ {gsub(/"/,""); print $3}' register: java_version_from_path - name: Display the java version from the java location debug: msg: "{{ java_version_from_path.stdout }}"
这个命令会先过滤包含version的行,去掉所有引号后直接提取版本号字段,适配多数JDK版本的输出格式。
3. 检查执行权限
确保Ansible执行任务的用户(比如默认的ansible用户)对目标Java可执行文件有执行权限。可以在目标主机上执行:
su - ansible_user -c '/usr/java/jdk-1.8/bin/java -version'
如果返回权限错误,执行chmod +x /usr/java/jdk-1.8/bin/java添加执行权限,或者调整用户权限组。
4. 直接在目标主机测试命令
以Ansible执行用户的身份,在目标主机上直接运行完整命令:
/usr/java/jdk-1.8/bin/java -version 2>&1 | awk -F '"' '/version/ {print $2}'
如果命令本身返回空,说明问题出在JDK本身或命令逻辑,而非Ansible配置。此时可以先单独执行/usr/java/jdk-1.8/bin/java -version,检查JDK是否能正常输出版本信息。
优化后的任务示例
可以添加路径检查逻辑,避免执行无效命令:
- name: Check if specified Java executable exists stat: path: /usr/java/jdk-1.8/bin/java register: java_executable - name: Fetch Java version only if executable exists shell: "{{ java_executable.stat.path }} -version 2>&1 | awk '/version/ {gsub(/\"/, \"\"); print $3}'" register: java_version_from_path when: java_executable.stat.exists and java_executable.stat.executable - name: Display Java version debug: msg: "Java version at specified path: {{ java_version_from_path.stdout | default('Not found or not executable') }}"
内容的提问来源于stack exchange,提问作者JCDani
相关产品推荐
相关产品推荐

