如何在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
相关产品推荐
相关产品推荐

