英文:
Ansible to check for Java and install if not already on RHEL machines
问题
- name: 获取Java版本
shell: java -version 2>&1 | grep version | awk '{print $3}' | sed 's/" //g'
changed_when: False
register: java_result
failed_when: False
- name: 打印Java版本
debug:
msg: " {{ java_result.stdout }} "
when: java_result.rc==0
- name: 安装Java版本
yum:
name: java-1.8.0-openjdk.x86_64
state: present
when: java_result.rc!=0
最终生效的结果:
- name: 获取Java版本
shell: java -version
changed_when: False
register: java_result
failed_when: False
- name: 安装Java版本
yum:
name: java
state: latest
when: java_result.rc!=0
become: yes
become_user: root
谢谢。
英文:
Trying to create a job that will check for java and install if it comes back as not installed. All works with the exception of the install part. Ansible is telling me a conditional has not been met so it skips the install.
- 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
The end result that works:
- 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
thanks.
答案1
得分: 2
问题在于您的 shell
命令是一个管道,管道的结果值(默认情况下)是管道中最后一个命令的结果。在这种情况下,最后一个命令是 sed
,它将正常关闭,因此返回的 rc 值是 0
。
有多种方法可以解决这个问题;我首先想到的方法是将您的 shell
命令更改为仅运行 java -version
。然后您可以检查该命令的 rc
值:如果它是非零的,那么安装 Java,如果它是零,那么您可以使用一些复杂的正则表达式来提取版本字符串并打印它。
或者,您可以直接使用 stat
模块检查 Java 可执行文件的存在性。
或者,您可以在不先检查 java
的情况下运行 yum
块 - 如果该软件包已经安装,它不会执行任何操作。这可能是最符合 Ansible 风格的方式。
英文:
The problem is that your shell
command is a pipeline, and the result value of a pipeline is (by default) the result of the last command in the pipeline. In this case it is sed
, which will be closing normally, so will have a rc of 0
.
There are a number of ways you could solve this problem; the first one that comes to mind is to change your shell
command to only run java -version
. Then you can check the rc
value of that command: if it is non-zero then install java, if it is zero then you can do some fancy regex to extract the version string and print it.
Or, you could check directly for the existence of the java executable with the stat
module.
Or, you could just run the yum
block without checking for java
first - if the package is already installed, it won't do anything. That's probably the most Ansibley way to do it.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论