如何在Ansible中创建默认空dict以合并筛选器?

如何在Ansible中创建默认空dict以合并筛选器?,ansible,Ansible,我写一个角色。在defaults/main.yml中,我有: sysctl: net.inet.ip.forwarding: 1 vm.swappiness: 10 tasks/main.yml: - name: Setup sysctl.conf sysctl: name="{{ item.0 }}" value="{{ item.1 }}" state=present become: yes loop: "{{ sysctl_default | combine(sysc

我写一个角色。在defaults/main.yml中,我有:

sysctl:
  net.inet.ip.forwarding: 1
  vm.swappiness: 10
tasks/main.yml:

- name: Setup sysctl.conf
  sysctl: name="{{ item.0 }}" value="{{ item.1 }}" state=present
  become: yes
  loop: "{{ sysctl_default | combine(sysctl) | dictsort }} "
如果用户未在vars ansible中定义
sysctl
,则将引发错误。如果用户跳过此设置,则必须设置默认参数。如果用户的剧本中有ommit sysctl设置,如何创建空字典?这种表达式
{{sysctl|u default | combine(sysctl | default({}))| dictsort}
不起作用:

fatal: [192.168.140.96]: FAILED! => {"msg": "|combine expects dictionaries, got AnsibleUndefined"}
Q:{sysctl|u default | combine(sysctl | default({})| dictsort}}不起作用”

答:……因为缺少右括号“)”。正确的语法是

{{ sysctl_default | combine(sysctl|default({})) | dictsort }}
问:“这同样不起作用:致命:[192.168.140.96]:失败!=>{“msg”:“|合并预期词典,得到ansibleundefine”}”


答:下一个问题是未定义的变量sysctl\u default。比如这出戏

  vars:
    sysctl_default:
      net.inet.ip.forwarding: 1
      vm.swappiness: 10
  tasks:
    - debug:
        msg: "name={{ item.0 }} value={{ item.1 }} state=present"
      loop: "{{ sysctl_default | combine(sysctl|default({})) | dictsort }}"
给予


我认为在任务中添加
when
子句更有意义,以检查
sysctl
变量是否已定义并包含项。通过添加默认过滤器,您计划实现什么?在没有有效更改的情况下运行
sysctl
任务?我计划在默认情况下添加
net.inet.ip.forwarding:1
,因为此角色用于路由器。因此,即使用户跳过此设置,也可以,角色会明确地处理它:)谢谢注意,但这仍然不起作用:
fatal:[192.168.140.96]:失败!=>{“msg”:“| combine expected dictionary,get AnsibleUndefined”}
下一个问题是未定义的变量
sysctl\u default
。这很奇怪!但您的游戏在我的虚拟机上运行得很好,但在OpenBSD上却不行:)这可能是由python版本引起的吗?在我的本地机器上是3.5.2,在我的OpenBSD机器上是3.6.8。我不这么认为。该剧在FreeBSD12.0上运行良好,python版本=3.6.8。对不起,该剧在OpenBSD上也运行良好。但当我开始扮演我的角色时,我犯了一个致命的错误。我在某处出错了。我会努力找到它。谢谢你的帮助,弗拉基米尔!
"msg": "name=net.inet.ip.forwarding value=1 state=present"
"msg": "name=vm.swappiness value=10 state=present"