如何创建默认的空字典以组合Ansible中的过滤器?

时间:2019-10-25 09:55:14

标签: 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(sysctl) | dictsort }} "

如果用户未在vars中定义sysctl,则ansible将引发错误。如果用户跳过此设置,则必须设置默认参数。如果用户在其剧本中省略sysctl设置,如何创建空字典?这样的表达式{{ sysctl_default | combine(sysctl | default({})) | dictsort }}不起作用:

fatal: [192.168.140.96]: FAILED! => {"msg": "|combine expects dictionaries, got AnsibleUndefined"}

1 个答案:

答案 0 :(得分:1)

  

Q:“ {{sysctl_default | Combine(sysctl | default({})| dictsort}}不起作用”

A:...由于缺少右括号“)”。正确的语法是

{{ sysctl_default | combine(sysctl|default({})) | dictsort }}
  

Q:“再次失败:致命:[192.168.140.96]:失败!=> {“ msg”:“ |组合需要字典,得到了AnsibleUndefined”}“

A:下一个问题是未定义的变量sysctl_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 }}"

给予

"msg": "name=net.inet.ip.forwarding value=1 state=present"
"msg": "name=vm.swappiness value=10 state=present"