我想在我的清单的所有节点上将一个变量重置为空列表,无论它是否已经存在。
我最好的建议是:
- name: clear union_files list
set_fact:
hostvars: "{{ hostvars.item | combine({'union_files': []}) }}"
loop: "{{ groups['all'] }}"
run_once: true 但是在这段代码中,我得到了一个我不理解的错误:
MSG:
|combine expects dictionaries, got Undefined当我设置dict {'union_files':[]}时,为什么显示未定义
你有什么线索吗?最可行的方式是什么呢?
发布于 2019-09-07 14:04:06
这里面有几件事;首先,hostvars.item与hostvars[item]不一样;前一种语法是为在dict中解引用键的快捷方式而设计的,比如ansible_version.full,它不是名为full的变量,而是ansible_version["full"]。后者在dict中查找变量键名
第二件事是,您试图将hostvars赋给它,就好像它是一个事实,但它不是一个事实,它是一个包含事实的命名空间。因此,即使您要执行hostvars: {{ hostvars[item] }},它也会在hostvars名称空间中创建一个名为hostvars的事实
如果您只想清除union_files事实,那么可以像往常一样使用set_fact:
- name: clear union_files list
set_fact:
union_files: []并且,假设该任务所在的攻略是hosts: all,那么它将在每台主机上愉快地将union_files设置或重置为[]
发布于 2019-09-11 03:50:39
谢谢马修
我最终想出了这个解决方案:
- name: clear list
set_fact:
union_files: []
delegate_to: item
loop: "{{ ansible_play_hosts }}"
run_once: true 来完成这项工作。
https://stackoverflow.com/questions/57829686
复制相似问题