Как перезагружаться в середине состояния соли?
(это копия вопроса, который я задал группе солевых пользователей, FWIW)
Мне нужно написать состояние, которое устанавливает некоторые функции сервера Windows, перезагружает миньон, а затем устанавливает еще несколько программ. Кажется, что все части есть (cmd.wait, system.reboot), но у меня возникли проблемы с подключением точек.
Например, у меня есть состояние "веб-сервер", которое должно установить IIS на машине. Он должен включить некоторые функции сервера, перезагрузить (потому что Windows), а затем продолжить. Мы делаем это с помощью настраиваемого модуля с именем "веб-сайт", который позволяет мне установить веб-сайт и еще один модуль для установки пулов приложений. Наш файл состояния выглядит примерно так:
my_website:
website.installed:
- name: example.com
- version: alpha-1.0.0
- type: Website
- bindings:
- hostheader: localhost
- port: 1234
- installdir: c:\\wwwroot\\example.com
- apppool: static
- require:
- sls: serverstate.webserver
- sls: apppool.static
Вышеизложенное отлично работает, за исключением того факта, что нам нужно выполнить перезагрузку между требованиями "serverstate.webserver" и "apppool.static". Как бы то ни было, состояние терпит неудачу, мы вручную перезагружаемся, а затем перезапускаем состояние, и оно работает. Естественно, мы хотим опустить шаг ручной перезагрузки.
Существует ли общий шаблон для решения этой проблемы?
Ответы
Ответ 1
Я сталкивался с этим в прошлом. То, что я сделал для получения необходимого поведения, - это использование jinja для решения во время выполнения, если нужно выполнить раздел вашего файла sls. Я делаю это, когда каждый раздел, который нуждается в перезагрузке, настраивает пользовательское зерно, как только оно получится. Затем на следующих запусках будет пропущен раздел, который уже завершен.
Вот пример файла sls.
{% if grains.get('myapp_done') != 'completed' %}
myapp:
pkg.installed:
- source: salt:/windows/myapp.exe
myapp_done:
module.run:
- name: grains.setval
- key: myapp
- val: complete
system.reboot:
module.run:
- watch:
- pkg: myapp
{% endif %}
{% if grains.get('myotherapp_done') != 'completed' %}
myotherapp:
pkg.installed:
- source: salt:/windows/myotherapp.exe
myotherapp_done:
module.run:
- name: grains.setval
- key: myotherapp
- val: complete
system.reboot:
module.run:
- watch:
- pkg: myotherapp
{% endif %}
Затем либо запустите highstate несколько раз, либо установите в конфигурацию minion следующую команду для запуска highstate при запуске.
startup_states: highstate