我在列表中有一组数字
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
由于
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事实。