可以检查Java并安装如果尚未在RHEL机器上安装

问题描述

尝试创建一个作业,该作业将检查Java并进行安装(如果它恢复为未安装状态)。除安装部分外,所有其他功能均可使用。 Ansible告诉我没有满足条件,因此跳过安装。

- name: fetch java version
  shell: java -version 2>&1 | grep version | awk  '{print $3}' | sed 's/" //g'
  changed_when: False
  register: java_result
  Failed_when: False

- name: print java version
  debug:
    msg: " {{ java_result.stdout }} "
  when: java_result.rc==0

- name: install java version
  yum: 
    name: java-1.8.0-openjdk.x86_64
    present: yes
  when: java_result.rc!=0

有效的最终结果:

- name: fetch java version
  shell: java -version
  changed_when: False
  register: java_result
  Failed_when: False

- name: install java version
  yum:
    name: java
    state: latest       
  when: java_result.rc!=0
  become: yes
  become_user: root

谢谢。

解决方法

问题是您的shell命令是管道,并且管道的结果值(默认情况下)是管道中 last 命令的结果。在这种情况下,sed将正常关闭,因此rc为0

有多种方法可以解决此问题;首先想到的是将shell命令更改为仅运行java -version。然后,您可以检查该命令的rc值:如果它不是非零,则安装Java,如果它为零,则可以执行一些正则表达式来提取版本字符串并打印。

或者,您可以使用stat模块直接检查是否存在Java可执行文件。

或者,您可以运行yum块而无需先检查java-如果已经安装了该软件包,它将不会执行任何操作。这可能是最Ansibley的方法。