Ansible中set_fact使用异常求助:无法生成预期列表数据
Ansible set_fact 处理列表数据问题解决方法
问题根源
你的代码存在三个核心问题:
- 未初始化列表变量:
name_list和priv_list没有预先定义为空列表,第一次循环时会因变量不存在报错,或导致拼接逻辑异常。 - 字符串与列表拼接错误:
item.split() | first返回的是单个字符串,直接和列表相加会把字符串拆成单个字符(比如"nilaj"会被拆成['n','i','l','a','j']),而非作为整体元素加入列表。 - priv_list更新逻辑错误:代码中用
name_list来拼接priv_list的内容,逻辑完全错误,应该基于priv_list自身进行更新。
修正方案1:循环方式修正
先初始化空列表,再循环更新:
# 先初始化两个空列表 - set_fact: name_list: [] priv_list: [] # 循环处理用户列表,将拆分后的元素分别加入对应列表 - set_fact: name_list: "{{ name_list + [item.split() | first] }}" priv_list: "{{ priv_list + [item.split() | last] }}" loop: "{{ user_list }}"
修正方案2:更简洁的map过滤器方式
无需循环,直接用map和list过滤器一次性处理,效率更高:
- set_fact: name_list: "{{ user_list | map('split') | map('first') | list }}" priv_list: "{{ user_list | map('split') | map('last') | list }}"
验证结果
添加debug任务查看最终输出:
- debug: msg: - "name_list: {{ name_list }}" - "priv_list: {{ priv_list }}"
执行后会得到预期结果:
name_list: ["nilaj", "ajin"] priv_list: ["15", "15"]
内容的提问来源于stack exchange,提问作者Balkrushna.Kamble
相关产品推荐
相关产品推荐

