Ansible play 在满足条件时停止 playbook

Ansible play 在满足条件时停止 playbook

我需要在剧本中创建一个剧本,当满足条件时剧本会失败。

更具体地说,如果用户尝试重新安装目标服务器上已安装的 openjdk 版本,则该播放将进行此检查并失败,任务列表中的其余播放将被取消。

到目前为止,我已经尝试过以下玩法:

- name: Checking the old version
  shell: java -version 2> openjdk_version.txt ; grep -i "openjdk version" openjdk_version.txt > java_version_used.txt ; cut -d " " -f 3 java_version_used.txt | tr -d '"'
  register: jdk_old_vers

- name: Comparing the new version with the older version
  fail:
    msg: The version selected for installation already exists on the server. Make sure you are selecting a different version! The play will now be stopped.
  when: "{{ jdk_new_version }} == {{ jdk_old_vers.stdout }}"

播放结果报错:

"msg": "条件检查 '{{ jdk_new_version }} != {{ jdk_old_vers.stdout }}' 失败。错误为:检测到无效条件:语法无效

尝试过:

when: "{{ jdk_new_version }} = {{ jdk_old_vers.stdout }}"

但仍然失败并出现相同的错误。

jdk_new_version的值=1.8.0_332。

似乎无法理解我的错误在哪里......我做错了什么?

答案1

在条件中,不要关闭双括号中的变量"{{ }}"。默认情况下,变量在条件中展开。例如,测试一下

    - debug:
        msg: Fail
      when: jdk_new_version == jdk_old_vers.stdout
      vars:
        jdk_new_version: 1.8.0_332
        jdk_old_vers:
          stdout: 1.8.0_332

给出

  msg: Fail

有关高级选项,请参阅比较版本。例如测试新版本是否低于或等于旧版本

    - debug:
        msg: Fail
      when: jdk_new_version is version(jdk_old_vers.stdout, '<=')

答案2

如果您想在条件满足时结束剧本


- meta: end_play
  when:
    -  jdk_new_version == jdk_old_vers.stdout
  vars:
    jdk_new_version: 1.8.0_332
    jdk_old_vers:
        stdout: 1.8.0_332

相关内容