You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:08:26