Как перезагружаться в середине состояния соли?

(это копия вопроса, который я задал группе солевых пользователей, 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