如何用Jinja和Ansible提取AD中的有效组数据?
Ansible 提取AD中指定前缀组名(过滤空值)
需求
通过Ansible的getent模块结合Jinja2,从多台主机收集AD组列表,仅提取带host-前缀的组名,剔除空值项。
现有数据(group_output)
group_output: results: - ansible_facts: getent_group: host-sys@domain: - user01@domain,user02@domain - ansible_facts: getent_group: host-oradbs@domain: - ansible_facts: getent_group: host-webdev@domain: - ansible_facts: getent_group: host-docker@domain:
当前使用的Jinja代码
{{ group_output.results | json_query('[].ansible_facts.getent_group') }}
当前输出结果
[{'host-sys@domain': ['user01@domain,user02@domain']}, {'host-oradbas@domain': None}, {'host-webdev@domain': None}, {'host-docker@domain': None}]
解决方案
方式1:Jinja2过滤器组合
直接通过多层过滤器提取并筛选:
{{ group_output.results | json_query('[].ansible_facts.getent_group | keys(@)') | flatten | select('match', '^host-') | list }}
方式2:简化逻辑的写法
也可以用更紧凑的组合实现:
{{ group_output.results | json_query('[].ansible_facts.getent_group | keys(@)') | flatten | select('search', '^host-') | list }}
执行结果
上述代码会输出纯净的目标组名列表:
['host-sys@domain', 'host-oradbs@domain', 'host-webdev@domain', 'host-docker@domain']
关键逻辑说明
json_query('[].ansible_facts.getent_group | keys(@)'):提取每个主机结果中getent_group的所有键(即AD组名)flatten:将分散的子列表合并为一维列表select('match', '^host-'):精准筛选以host-开头的组名(若只需包含该前缀,可替换为search)list:将筛选后的迭代对象转为可直接使用的列表
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

