如何使用Ansible assert模块遍历嵌套字典校验所有变量是否已定义
Ansible多类型仓库必填变量校验方案
完全可以实现,你只需要先定义好每种仓库类型对应的必填字段映射,再遍历所有仓库匹配对应规则校验即可,具体实现如下:
步骤1:定义各类型仓库必填字段映射
先在变量中声明不同类型仓库需要校验的字段,嵌套字段用点分隔:
repo_required_fields: hosted: - name - online - storage.blobStoreName - storage.strictContentTypeValidation - storage.writePolicy proxy: - name - online - storage.blobStoreName - storage.strictContentTypeValidation - storage.writePolicy - proxy.remoteUrl - proxy.contentMaxAge - proxy.metadataMaxAge - negativeCache.enabled - negativeCache.timeToLive - httpClient.blocked - httpClient.autoBlock group: - name - online - storage.blobStoreName - storage.strictContentTypeValidation - storage.writePolicy - group.groupMembers
步骤2:编写校验任务
先把所有待校验的仓库和对应必填字段组合展开,再逐一校验:
# 先生成校验清单 - name: 生成仓库字段校验清单 set_fact: check_list: "{{ check_list | default([]) + [ 'repo_type': repo_item.0.key, 'repo_name': repo_item.1.name, 'repo_config': repo_item.1, 'required_field': field ] }}" loop: "{{ repo_type | dict2items | subelements('value.data') }}" loop_control: loop_var: repo_item vars: current_type_fields: "{{ repo_required_fields[repo_item.0.key] }}" loop: "{{ current_type_fields }}" loop_control: loop_var: field # 执行校验 - name: 校验所有仓库必填字段已定义 assert: that: - item.repo_config | json_query(item.required_field) is defined fail_msg: "校验失败:{{ item.repo_type }}类型仓库{{ item.repo_name }}缺少必填字段{{ item.required_field }}" success_msg: "校验通过:{{ item.repo_type }}类型仓库{{ item.repo_name }}字段{{ item.required_field }}已定义" loop: "{{ check_list }}"
注意事项
- 你给出的示例变量中,proxy类型仓库的
timeToLive”用了中文右双引号,实际使用时要改成英文双引号,避免YAML解析报错 - 如果需要同时校验字段不为空,可以在assert的that数组里新增判断:
item.repo_config | json_query(item.required_field) | length > 0 - 若Ansible版本较低不支持json_query,可将判断条件替换为
lookup('vars', 'item.repo_config.' ~ item.required_field) is defined,效果一致
内容的提问来源于stack exchange,提问作者user12377632
相关产品推荐
相关产品推荐

