使用Ansible Jinja2统计列表字段出现次数并生成对应字典
问题根源
你的原有代码计数逻辑错误,j.count(j)是对单个用户名字符串自身统计匹配次数,返回值永远为1,因此所有用户的计数结果都会是1。
修正方案
方案1:最小修改原有逻辑
仅调整计数的取值来源,同时对去重后的用户名循环避免重复更新操作:
- set_fact: users: |- {%- set user_list = [] -%} {%- set u_dict = {} -%} {%- for i in str_lst -%} {{ user_list.append(i.split()[1]) }} {%- endfor -%} {%- for j in user_list | unique -%} {{ u_dict.update({j: user_list.count(j)}) }} {%- endfor -%} {{ u_dict }} - debug: var=users
运行后即可得到你期望的{"user1": 3, "user2": 2}输出。
方案2:更简洁的过滤器写法
如果你的Ansible环境安装了community.general集合(绝大多数默认发行版都已预装),可以直接用counter过滤器实现,无需手写循环:
- set_fact: users: "{{ str_lst | map('split') | map(attribute=1) | community.general.counter }}" - debug: var=users
内容的提问来源于stack exchange,提问作者Vijesh
相关产品推荐
相关产品推荐

