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 与包管理器一起安装时才有效(不只是复制到您的系统中)