Мы используем SaltStack для управления конфигурацией уже несколько недель.
Как справиться с распределением конкретного местоположения systemctl
?
/bin/systemctl
/usr/bin/systemctl
На данный момент я добавляю в файл sudoers две строки:
etc_sudoers:
file.blockreplace:
- name: /etc/sudoers
- marker_start: "# START managed etc_sudoers -DO-NOT-EDIT-"
- marker_end: "# END managed zone etc_sudoers --"
- content: |
some_user ALL = NOPASSWD: /bin/systemctl restart apache2
some_user ALL = NOPASSWD: /usr/bin/systemctl restart apache2
{% endfor %}
- append_if_not_found: True
- backup: '.bak'
- show_changes: True
.... Нет более простого решения?
К сожалению, нет более простого или автоматического способа. Но есть способ лучше следовать Рекомендации по использованию соли, используя файл map.jinja.
В формулах соли строго принято помещать специфичные для платформы данные, такие как имена пакетов и пути файловой системы, в файл с именем map.jinja, который размещается рядом с файлами состояния.
Его использование обеспечит модульность ваших состояний, что позволит им работать независимо от ОС миньона.
Ниже приведен пример того, как будет выглядеть ваш файл map.jinja в представленном вами сценарии. Он отфильтрует миньона по семейству ОС и установит в соответствии с ним переменные:
{% set systemctl = salt['grains.filter_by']({
'Debian': {
'location': '/bin/systemctl'
},
'Suse': {
'location': '/usr/bin/systemctl'
}
} %}
Теперь вам нужно импортировать его в свой файл состояния и использовать ранее определенные переменные:
{% from "systemctl/map.jinja" import systemctl with context %}
etc_sudoers:
file.blockreplace:
- name: /etc/sudoers
- marker_start: "# START managed etc_sudoers -DO-NOT-EDIT-"
- marker_end: "# END managed zone etc_sudoers --"
- content: some_user ALL = NOPASSWD: {{ systemctl.location }} restart apache2
- append_if_not_found: True
- backup: '.bak'
- show_changes: True
Для получения дополнительной информации, пожалуйста, взгляните на модульность и Справочная таблица сеансы док.