Ansible 或无法正常工作(我知道是我!)

Ansible OR not working correctly (I know its me!)

我知道这是我做错的事情,但它慢慢地让我发疯。请注意,不幸的是,这不能被 yum 控制。我有一个 ansible playbook 检查是否存在 tomcat,然后检查文件内容并检索版本:

变量:

tomcat_version: 9.0.62

支票:

- name: Check for Tomcat installation
  stat:
    path: "{{ tomcat_directory }}/lib/catalina.jar"
  register: tomcat_already_installed
    
- name: Get existing Tomcat version
  shell: "{{ java_directory }}/bin/java -cp {{ tomcat_directory }}/lib/catalina.jar org.apache.catalina.util.ServerInfo |grep \"Server number\" |awk -F':[[:blank:]]*' '{print }' | sed '/\./ s/\.\{0,1\}0\{1,\}$//'"
  register: existing_tomcat_version

这个returns一个true/false还有一个版本号。

如果版本(在 vars 中设置)不匹配或找到 Tomcat,下一个 playbook 将安装 Tomcat 或升级它。

- name: Install tomcat
  include_tasks: install.yml
  when:
       

我遇到的问题是 when 语句。这两个独立工作:

#   - not tomcat_already_installed
#   - "existing_tomcat_version.stdout|string not in tomcat_version"

但是,我尝试了它们之间的 or,它要么根本不安装,要么只是保持 运行每隔 运行 安装程序一次。我尝试过的事情:

#    - "not tomcat_already_installed or existing_tomcat_version.stdout|string not in tomcat_version"
#    - not tomcat_already_installed or existing_tomcat_version.stdout|string not in tomcat_version
#    - not tomcat_already_installed or 'existing_tomcat_version.stdout|string not in tomcat_version'
    - not tomcat_already_installed or "existing_tomcat_version.stdout|string" not in tomcat_version
    - "( not tomcat_already_installed or existing_tomcat_version.stdout|string not in tomcat_version"

除了值看起来正常之外,调试并没有真正向我显示任何内容:

- name: Debug existing_tomcat_version.stdout
  debug:
    msg: "existing_tomcat_version = {{ existing_tomcat_version }}"

- name: Debug vars_tomcat_version
  debug:
    msg: "vars_tomcat_version = {{ tomcat_version }}"

    ok: [i-0ddfdsfdsf90b8] => {
        "msg": "existing_tomcat_version = 9.0.62"
    }
    
    Thursday 12 May 2022  15:38:27 +0200 (0:00:00.012)       0:00:38.711 ********** 
    ok: [i-sdfdsfsdfsdffd] => {
        "msg": "vars_tomcat_version = 9.0.62"
    }
    
    
    
    TASK [tomcat : debug tomcat_already_installed] *********************************************************************************************************************************************************************************************************************************
    Thursday 12 May 2022  16:12:12 +0200 (0:00:00.915)       0:00:38.940 ********** 
    Thursday 12 May 2022  16:12:12 +0200 (0:00:00.915)       0:00:38.939 ********** 
    ok: [i-sdfsdfsdfsdfsdf] => {
        "msg": "tomcat_already_installed = {'stat': {'exists': False}, 'changed': False, 'failed': False}"

欢迎任何帮助,我确定这只是字符串误读或格式问题。 谢谢!

为了让您步入正轨,以下剧本:

---
- hosts: localhost
  gather_facts: false

  vars:
    # Fake the original example vars from extra_vars on this example
    existing_tomcat_version:
      stdout: "{{ f_tomcat_version | d('0.0.0') }}"
    tomcat_already_installed: "{{ f_tomcat_exists | bool }}"

    tomcat_version: 9.0.62

  tasks:
    - debug:
        msg: "Tomcat isn't installed or is not using version {{ tomcat_version }}"
      when: not (tomcat_already_installed and existing_tomcat_version.stdout is version(tomcat_version, 'eq'))

具有作为额外变量传递的不同伪造值的给定:

$ ansible-playbook playbook.yml -e f_tomcat_exists=false

PLAY [localhost] ****************************************************************************************************************************

TASK [debug] ********************************************************************************************************************************
ok: [localhost] => {
    "msg": "Tomcat isn't installed or is not using version 9.0.62"
}

PLAY RECAP **********************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

$ ansible-playbook playbook.yml -e f_tomcat_exists=true -e f_tomcat_version=8.4.5

PLAY [localhost] ****************************************************************************************************************************

TASK [debug] ********************************************************************************************************************************
ok: [localhost] => {
    "msg": "Tomcat isn't installed or is not using version 9.0.62"
}

PLAY RECAP **********************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

$ ansible-playbook playbook.yml -e f_tomcat_exists=true -e f_tomcat_version=9.0.62

PLAY [localhost] ****************************************************************************************************************************

TASK [debug] ********************************************************************************************************************************
skipping: [localhost]

PLAY RECAP **********************************************************************************************************************************
localhost                  : ok=0    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0