首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将hostvars的var初始化为null

如何将hostvars的var初始化为null
EN

Stack Overflow用户
提问于 2019-09-07 08:04:33
回答 2查看 161关注 0票数 0

我想在我的清单的所有节点上将一个变量重置为空列表,无论它是否已经存在。

我最好的建议是:

代码语言:javascript
复制
- name: clear union_files list 
  set_fact: 
    hostvars: "{{ hostvars.item | combine({'union_files': []}) }}" 
  loop: "{{ groups['all'] }}" 
  run_once: true 

但是在这段代码中,我得到了一个我不理解的错误:

代码语言:javascript
复制
MSG:

|combine expects dictionaries, got Undefined

当我设置dict {'union_files':[]}时,为什么显示未定义

你有什么线索吗?最可行的方式是什么呢?

EN

回答 2

Stack Overflow用户

发布于 2019-09-07 14:04:06

这里面有几件事;首先,hostvars.itemhostvars[item]不一样;前一种语法是为在dict中解引用键的快捷方式而设计的,比如ansible_version.full,它不是名为full的变量,而是ansible_version["full"]。后者在dict中查找变量键名

第二件事是,您试图将hostvars赋给它,就好像它是一个事实,但它不是一个事实,它是一个包含事实的命名空间。因此,即使您要执行hostvars: {{ hostvars[item] }},它也会在hostvars名称空间中创建一个名为hostvars事实

如果您只想清除union_files事实,那么可以像往常一样使用set_fact

代码语言:javascript
复制
- name: clear union_files list 
  set_fact: 
     union_files: []

并且,假设该任务所在的攻略是hosts: all,那么它将在每台主机上愉快地将union_files设置或重置为[]

票数 0
EN

Stack Overflow用户

发布于 2019-09-11 03:50:39

谢谢马修

我最终想出了这个解决方案:

代码语言:javascript
复制
- name: clear list 
  set_fact: 
      union_files: [] 
  delegate_to: item 
  loop: "{{ ansible_play_hosts }}" 
  run_once: true 

来完成这项工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57829686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档