Назад | Перейти на главную страницу

SaltStack: обнаружен конфликтующий идентификатор

Мой файл sls:

/etc/sudoers.d/foo:
  file.managed:
    - contents: |
      foo ALL = NOPASSWD: /usr/bin/systemctl restart minio_storage-foo.service
      foo ALL = NOPASSWD: /bin/systemctl restart minio_storage-foo.service
    - template: jinja
    - mode: 0440

Сообщение об ошибке:

salt:/srv # salt-ssh aptguettler state.sls minio_storage

[CRITICAL] Rendering SLS 'base:minio_storage.django' failed: while constructing a mapping
  in "<unicode string>", line 29, column 7
found conflicting ID 'foo ALL = NOPASSWD'
  in "<unicode string>", line 31, column 7
aptguettler:
    - Rendering SLS 'base:minio_storage.django' failed: while constructing a mapping
        in "<unicode string>", line 29, column 7
      found conflicting ID 'foo ALL = NOPASSWD'
        in "<unicode string>", line 31, column 7

Что случилось?

Это:

- contents: |

вводит значение для contents это буквальный скаляр блочного стиля, который выполняется для всех следующих строк с отступом. Отступ должен быть больше, чем отступ ключа contents. С вашей следующей строки

  foo ALL = NOPASSWD: /usr/bin/systemctl restart minio_storage-foo.service

больше не имеет отступа, он завершает скаляр литерала блочного стиля (до пустой строки), а затем вводит следующий ключ foo ALL = NOPASSWD со значением /usr/bin/systemctl restart minio_storage-foo.service для отображения, которое является первым элементом последовательности. Однако следующая строка имеет тот же ключ, для этого сопоставления и сопоставления ключи должны быть уникальными в YAML, отсюда и ошибка.

Как вы обнаружили, вам нужно сделать отступ строк, следующих за буквальным скалярным индикатором (|), и должно быть очевидно, почему это так: значение для ключа должно иметь больший отступ, чем ключ, иначе вы не узнаете, когда был введен следующий ключ для сопоставления.

Не спрашивайте меня, почему, но это работает.

/etc/sudoers.d/foo:
  file.managed:
    - contents: |
       foo ALL = NOPASSWD: /usr/bin/systemctl restart minio_storage-foo.service
       foo ALL = NOPASSWD: /bin/systemctl restart minio_storage-foo.service
    - template: jinja
    - mode: 0440

Вы заметили разницу?

Перед "foo ALL" стоит еще один пробел. Grrrr YAML.