问题描述
尝试创建一个作业,该作业将检查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的方法。