Ansible检查Java,如果RHEL机器上还没有安装,则安装

Ansible检查Java,如果RHEL机器上还没有安装,则安装,java,ansible,rhel,Java,Ansible,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_wh

尝试创建一个作业,该作业将检查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
命令是一个管道,管道的结果值(默认情况下)是管道中最后一个命令的结果。在这种情况下,它是
sed
,将正常关闭,因此rc将为
0

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

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


或者,您可以只运行
yum
块,而不首先检查
java
——如果包已经安装,它将不会做任何事情。这可能是最简单的方法。

在您的
yum
安装中添加
state:latest
?谢谢-我确实尝试过,并从ansible收到了相同的消息。可能是
yum
未被执行?你能在
yum
之前打印
rc
值吗?谢谢你的输入JBone,它帮了大忙。注意:Java8是EOL。谢谢lxop。我有点像你说的那样,在没有看到你的答案的情况下迂回地走了。但这是绝对正确的。非常感谢。