Java 无缘无故地跳过使用 ansible 的版本检查
Java version check using ansible is getting skipped for no apparent reason
作为我的 ansible 设置的一部分,我目前正在检查 VM 中的 Java 版本是什么,如果不是预期的版本,则下载并安装该版本。我已经给出了标准正则表达式来查找 Java 版本,但是该步骤被跳过了
- name: "[install] Check for Java install"
shell: "java -version 2>&1 | grep version | awk '{print }'"
changed_when: False
register: java_installed
ignore_errors: True
- when: java_installed.stdout != "17.0.2"
block:
- debug:
msg: "Java is not installed"
- name: "[install] Installing Java 17"
become: true
yum:
name: /var/tmp/jdk-17_linux-x64_bin.rpm
state: present
但是执行时会跳过这些步骤
TASK [java : [install] Check for Java install] *****************************************************************************************************************************
skipping: [VM name hidden by me ]
TASK [java : debug] ********************************************************************************************************************************************************
skipping: [VM name hidden by me]
TASK [java : [install] Installing Java 17] *********************************************************************************************************************************
skipping: [VM name hidden by me]
当我执行
java -version 2>&1 | grep version | awk '{print }'
这是我得到的
"1.8.0_312"
有谁知道为什么它会被跳过。谢谢
注意:下面是对你直接问题的回答。同时,如果 java 作为系统包安装,我强烈建议您查看@Jaay 的答案,直接从包事实中获取版本,而不是使用 shell/command
This is what I get
"1.8.0_312"
如您所见,引号是输出的一部分。因此,如果你调试 java_installed.stdout
你会得到 (运行 on my local machine with java 11):
TASK [debug] ********************************************************************************************************************
ok: [localhost] => {
"java_installed.stdout": "\"11.0.15\""
}
一个简单的解决方法是将传入值读取为 json。下面的工作(再次为我的本地机器定制测试并使用 version
测试作为良好实践)
---
- hosts: localhost
gather_facts: false
tasks:
- name: "[install] Check for Java install"
shell: "java -version 2>&1 | grep version | awk '{print }'"
changed_when: false
failed_when: false
register: java_installed
- name: show the raw and refactored captured var
vars:
my_msg:
- "Raw value for version is: {{ java_installed.stdout }}"
- "Refactored value for version is: {{ java_installed.stdout | from_json }}"
debug:
msg: "{{ my_msg }}"
- when: java_installed.stdout | from_json is version("11.0.15", "==")
debug:
msg: "Java 11 is installed"
- when: java_installed.stdout | from_json is not version("17.0.2", "==")
debug:
msg: "Java 17 is not installed"
并给出
PLAY [localhost] ****************************************************************************************************************
TASK [[install] Check for Java install] *****************************************************************************************
ok: [localhost]
TASK [show the raw and refactored captured var] *********************************************************************************
ok: [localhost] => {
"msg": [
"Raw value for version is: \"11.0.15\"",
"Refactored value for version is: 11.0.15"
]
}
TASK [debug] ********************************************************************************************************************
ok: [localhost] => {
"msg": "Java 11 is installed"
}
TASK [debug] ********************************************************************************************************************
ok: [localhost] => {
"msg": "Java 17 is not installed"
}
PLAY RECAP **********************************************************************************************************************
localhost : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
不太喜欢 Ansible 中的 shell 命令,您可以使用 package facts 核心插件来检索已安装的 Java 版本。这样你应该使用 shell 命令
摆脱输出问题
- name: get the rpm or apt package facts
package_facts:
manager: "auto"
- name: show Java version
debug: var=ansible_facts.packages.jdk[0].version
PS:仅当 java 与包管理器一起安装时才有效(不只是复制到您的系统中)
作为我的 ansible 设置的一部分,我目前正在检查 VM 中的 Java 版本是什么,如果不是预期的版本,则下载并安装该版本。我已经给出了标准正则表达式来查找 Java 版本,但是该步骤被跳过了
- name: "[install] Check for Java install"
shell: "java -version 2>&1 | grep version | awk '{print }'"
changed_when: False
register: java_installed
ignore_errors: True
- when: java_installed.stdout != "17.0.2"
block:
- debug:
msg: "Java is not installed"
- name: "[install] Installing Java 17"
become: true
yum:
name: /var/tmp/jdk-17_linux-x64_bin.rpm
state: present
但是执行时会跳过这些步骤
TASK [java : [install] Check for Java install] *****************************************************************************************************************************
skipping: [VM name hidden by me ]
TASK [java : debug] ********************************************************************************************************************************************************
skipping: [VM name hidden by me]
TASK [java : [install] Installing Java 17] *********************************************************************************************************************************
skipping: [VM name hidden by me]
当我执行
java -version 2>&1 | grep version | awk '{print }'
这是我得到的
"1.8.0_312"
有谁知道为什么它会被跳过。谢谢
注意:下面是对你直接问题的回答。同时,如果 java 作为系统包安装,我强烈建议您查看@Jaay 的答案,直接从包事实中获取版本,而不是使用 shell/command
This is what I get
"1.8.0_312"
如您所见,引号是输出的一部分。因此,如果你调试 java_installed.stdout
你会得到 (运行 on my local machine with java 11):
TASK [debug] ********************************************************************************************************************
ok: [localhost] => {
"java_installed.stdout": "\"11.0.15\""
}
一个简单的解决方法是将传入值读取为 json。下面的工作(再次为我的本地机器定制测试并使用 version
测试作为良好实践)
---
- hosts: localhost
gather_facts: false
tasks:
- name: "[install] Check for Java install"
shell: "java -version 2>&1 | grep version | awk '{print }'"
changed_when: false
failed_when: false
register: java_installed
- name: show the raw and refactored captured var
vars:
my_msg:
- "Raw value for version is: {{ java_installed.stdout }}"
- "Refactored value for version is: {{ java_installed.stdout | from_json }}"
debug:
msg: "{{ my_msg }}"
- when: java_installed.stdout | from_json is version("11.0.15", "==")
debug:
msg: "Java 11 is installed"
- when: java_installed.stdout | from_json is not version("17.0.2", "==")
debug:
msg: "Java 17 is not installed"
并给出
PLAY [localhost] ****************************************************************************************************************
TASK [[install] Check for Java install] *****************************************************************************************
ok: [localhost]
TASK [show the raw and refactored captured var] *********************************************************************************
ok: [localhost] => {
"msg": [
"Raw value for version is: \"11.0.15\"",
"Refactored value for version is: 11.0.15"
]
}
TASK [debug] ********************************************************************************************************************
ok: [localhost] => {
"msg": "Java 11 is installed"
}
TASK [debug] ********************************************************************************************************************
ok: [localhost] => {
"msg": "Java 17 is not installed"
}
PLAY RECAP **********************************************************************************************************************
localhost : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
不太喜欢 Ansible 中的 shell 命令,您可以使用 package facts 核心插件来检索已安装的 Java 版本。这样你应该使用 shell 命令
摆脱输出问题- name: get the rpm or apt package facts
package_facts:
manager: "auto"
- name: show Java version
debug: var=ansible_facts.packages.jdk[0].version
PS:仅当 java 与包管理器一起安装时才有效(不只是复制到您的系统中)