Ansible - 如何查找列表中的值是否存在于另一个注册变量中?

问题描述 投票:0回答:1

我在列表中有一组数字

db_home_desired_patches_list
,我想检查列表中的这些数字是否存在于另一个注册变量
lspatches
中。

- name: Get opatch lspatches from dbhome_1
  shell: |
    $ORACLE_HOME/OPatch/opatch lspatches
  environment:
    ORACLE_HOME: "{{ db_home_1 }}"
    PATH: $ORACLE_HOME/bin:$ORACLE_HOME/lib:$PATH:/usr/bin
  register: lspatches
  failed_when:  ' db_home_desired_patches_list | difference (lspatches.stdout_lines) | length > 0 '

样本

db_home_desired_patches_list

[
"35985645",
"35778398",
"35597425",
"34939189"
    ]

输出

$ORACLE_HOME/OPatch/opatch lspatches

35985645;EVEV-DEV2   DB CONTINUOUS RESTARTS WITH ORA-00600  INTERNAL ERROR CODE, ARGUMENTS  [KDIFIND KCBZ_OBJDCHK]
35778398;FURTHER FIXES FOR ROW CACHE ON TOP OF 34304965\n35098441;LOGMINER FAILS TO PURGE LOGMNRC_TSPART AND OTHER SHARD TABLES
35597425;ORA-600 723 IN RFS PROCESS\n34939189;TRAIL FILE CORRUPTION DBFS\n36130656;MERGE ON DATABASE RU 19.22.0.0.0 OF 36092993
35511348;AIM ORA-7445 [KNLCAPINSPROC] - KNLCAPINSPROC\n36130831;MERGE ON DATABASE RU 19.22.0.0.0 OF 35989319
ansible
1个回答
0
投票

由于

opatch lspatches
的输出似乎是带有分隔符分号 (
;
) 的字符分隔值 (CSV) 列表,因此以下最小示例中显示了一种快速而懒惰的方法

---
- hosts: localhost
  become: false
  gather_facts: false

  vars:

    desired_patches: [
      "35985645",
      "35778398",
      "35597425",
      "34939189"
    ]

  tasks:

  - shell:
      cmd: 'cat lspatches | cut -d ";" -f 1'
    register: installed_patches

  - debug:
      msg: "Missing patches: {{ desired_patches | difference(installed_patches.stdout_lines) }}"

产生

的输出
TASK [debug] ***************************
ok: [localhost] =>
  msg: 'Missing patches: [''34939189'']'

文档


分配工作和任务可能会更好。

例如,定期将已安装补丁导出到 CSV 文件的 cron 作业将提供使用

read_csv
模块的选项 – 读取 CSV 文件,从而防止使用
shell
模块和“脚本” ”或剧本中的“编程”。

更好的是,如果将其实现为自定义事实将导致选择仅查询有关系统的事实,安装的补丁就像任何其他Ansible事实

© www.soinside.com 2019 - 2024. All rights reserved.