Как создать по умолчанию пустой dict для объединения фильтра в Ansible? - PullRequest
1 голос
/ 25 октября 2019

Я пишу роль. В 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 }} "

Если пользователь не определит sysctl в vars ansible, возникнет ошибка. Параметры по умолчанию должны быть установлены, если пользователь пропустит эти настройки. Как создать пустой словарь, если пользователь установил параметры sysctl в своей книге игр? Такое выражение {{ sysctl_default | combine(sysctl | default({})) | dictsort }} не работает:

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

1 Ответ

1 голос
/ 25 октября 2019

Q: "{{sysctl_default | объединить (sysctl | default ({}) | dictsort}} не работает"

A: ... из-за отсутствующего закрытияскобка ")". Правильный синтаксис:

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

Q: "Опять же это не работает: fatal: [192.168.140.96]: FAILED! => {" 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...