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

如何在Ansible中通过Glob模式匹配并遍历指定前缀的变量?

解决Ansible中通过前缀批量收集变量的问题

直接在loop中使用docker_compose_keycloak_config_cli_envvar_*这种Glob写法是错误的,Ansible不支持在模板或playbook中用shell风格的通配符引用变量。正确的做法是通过变量字典结合过滤器来筛选指定前缀的变量:

方法一:在Jinja2模板中直接处理

在templates/env-vars-keycloak-config-cli模板中写入以下代码,即可自动生成非空的环境变量:

{% for item in ansible_play_vars | dict2items 
   | selectattr('key', 'match', '^docker_compose_keycloak_config_cli_envvar_') 
   | rejectattr('value', 'none') 
   | rejectattr('value', 'equalto', '') %}
{{ item.key | regex_replace('^docker_compose_keycloak_config_cli_envvar_', '') }}={{ item.value | quote }}
{% endfor %}

代码说明:

  • ansible_play_vars:包含当前Play加载的所有变量(包括defaults、host_vars、group_vars等)
  • dict2items:将变量字典转换为{key: "变量名", value: "变量值"}的列表格式
  • selectattr('key', 'match', '^xxx'):用正则匹配变量名前缀,^确保匹配字符串开头,避免误匹配包含前缀的变量名
  • rejectattr过滤器:分别剔除值为None或空字符串的变量
  • regex_replace:去掉变量名的前缀,得到最终的环境变量键名
  • quote:对变量值进行转义,处理包含空格、引号等特殊字符的场景

方法二:先在Playbook中预处理变量列表

如果希望在Playbook中提前整理好变量列表,再传递给模板,可以用set_fact生成变量集合:

- name: 生成Keycloak Config CLI环境变量列表
  set_fact:
    keycloak_config_cli_envvars: >-
      {{ 
        ansible_play_vars | dict2items 
        | selectattr('key', 'match', '^docker_compose_keycloak_config_cli_envvar_') 
        | rejectattr('value', 'none') 
        | rejectattr('value', 'equalto', '') 
        | list 
      }}

之后在模板中直接循环这个预定义的列表:

{% for item in keycloak_config_cli_envvars %}
{{ item.key | regex_replace('^docker_compose_keycloak_config_cli_envvar_', '') }}={{ item.value | quote }}
{% endfor %}

注意事项

  • 若使用Ansible 2.8以下版本,ansible_play_vars不可用,可替换为hostvars[inventory_hostname],但需注意该变量包含大量Ansible内置变量,正则匹配前缀的步骤不可省略
  • 如果变量值是复杂类型(如列表、字典),需要根据Keycloak Config CLI的要求转换为字符串格式

内容的提问来源于stack exchange,提问作者Taavi Ansper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:39:16