我写一个角色。在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"}
答案 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"