如何向set_fact定义的字典中的数组添加元素?
解决Ansible字典内数组元素添加问题
问题根源
- 你最初的
update errors任务错误地将results变量直接替换成了errors数组,完全丢失了原字典的结构(包含corrections和errors两个键的字典)。 - 使用
combine过滤器时,你错误地用results.errors(一个列表)作为新字典的键,而字典的键必须是可哈希类型(如字符串),这才导致了unhashable type: 'list'错误。
正确实现方式
要保持原字典结构并向指定数组添加元素,需通过combine过滤器明确指定要更新的字符串键,并将对应的值设为原数组拼接新元素后的结果:
初始化字典(保留你的正确初始写法)
- set_fact: results: "{{ results | default({ 'corrections': [], 'errors': [] }) }}"
向errors数组添加元素
- name: 更新errors数组 set_fact: results: "{{ results | combine({'errors': results.errors + ['some error found']}) }}"
向corrections数组添加元素(同理)
- name: 更新corrections数组 set_fact: results: "{{ results | combine({'corrections': results.corrections + ['some correction done']}) }}"
补充说明
- 如果需要一次性添加多个元素,直接在列表中追加多个值即可,比如:
results.errors + ['error1', 'error2', 'error3'] combine过滤器会保留原字典中未指定的键(比如更新errors时,corrections会自动保留),完美保持原数据结构。
内容的提问来源于stack exchange,提问作者Mint
相关产品推荐
相关产品推荐

