Ansible 2.9如何校验inventory主机文件与group_vars目录一致性
Ansible 2.9 实现inventory组与group_vars配置一致性校验的方法
方案1:Playbook 内嵌校验任务(推荐,无需额外工具)
直接在业务playbook的最前面新增一个专属校验play,仅在本地运行无需连接远程主机,执行playbook时会优先触发校验,不符合要求直接终止运行:
--- - name: 校验inventory组与group_vars配置一致性 hosts: localhost gather_facts: no tasks: # 提取inventory中除默认组外的所有自定义组 - name: 获取所有自定义主机组 set_fact: inventory_groups: "{{ groups.keys() | difference(['all', 'ungrouped']) }}" # 扫描group_vars目录下所有yml/yaml配置文件 - name: 扫描已存在的group_vars配置 find: paths: ./group_vars patterns: - '*.yml' - '*.yaml' register: found_group_vars_files # 提取配置文件名(去掉后缀)作为已配置的组列表 - name: 格式化已配置的组名列表 set_fact: configured_groups: "{{ found_group_vars_files.files | map(attribute='path') | map('basename') | map('splitext') | map('first') | list }}" # 对比得到没有对应配置文件的缺失组 - name: 计算缺失配置的组列表 set_fact: missing_groups: "{{ inventory_groups | difference(configured_groups) }}" # 存在缺失组则抛出错误终止运行 - name: 校验不通过抛出错误 fail: msg: "Error No {{ item }} in group_var dir tree" loop: "{{ missing_groups }}" when: missing_groups | length > 0 # 下面接你原来的业务play # - name: 业务部署 # hosts: all # ...
方案2:独立预校验脚本(适合CI/CD流水线前置校验)
如果需要在运行playbook之前提前校验,可使用如下shell脚本,依赖ansible-inventory和jq工具:
#!/bin/bash # 提取所有自定义主机组 ansible-inventory -i hosts --list | jq -r 'keys[] | select(. != "all" and . != "_meta" and . != "ungrouped")' | sort > /tmp/inventory_groups.txt # 提取已配置的组名 ls group_vars/ | sed -E 's/\.(yml|yaml)$//' | sort > /tmp/configured_groups.txt # 对比找缺失组 missing_groups=$(comm -23 /tmp/inventory_groups.txt /tmp/configured_groups.txt) if [ -n "$missing_groups" ];then for group in $missing_groups;do echo "Error No $group in group_var dir tree" done rm -f /tmp/inventory_groups.txt /tmp/configured_groups.txt exit 1 fi rm -f /tmp/inventory_groups.txt /tmp/configured_groups.txt echo "校验通过,所有主机组均有对应group_vars配置"
适配说明
- 如果存在不需要配置group_vars的公共组,可在提取自定义组的步骤中将这类组加入排除列表,比如要排除
common组,修改为difference(['all', 'ungrouped', 'common'])即可 - 如果你的group_vars采用目录形式存储(即
group_vars/zone1/目录下存放多个配置文件),仅需将提取已配置组的逻辑改为读取目录名即可,无需处理文件后缀
内容的提问来源于stack exchange,提问作者CH06
相关产品推荐
相关产品推荐

