Создание патча для тонких клиентов

Все возможности, которые есть в TKControl, реализованы на основе SaltStack, поэтому для написания собственных наработок и использования предложенных решений, необходимо ознакомиться с документацией SaltStack.

Основные компоненты SaltStack

Вся основная логика по взаимодействию с клиентами содержится на сервере SaltMaster в директории /srv/salt` и файле `/etc/salt/master.d/reactor.conf:

  1. /etc/salt/master.d/reactor.conf - файл, декларирующий реакции, которые должны произойти при определенных событиях;

  2. /srv/salt/pillar - директория, содержащая переменные, которые устанавливаются на клиенте, перед выполненим какого-либо действия;

  3. /srv/salt/states - директория, содержащая состояния, которые могу применяться на клиенте;

  4. /srv/salt/reactor - директория, содержащая состояния реакций на определенные события;

  5. /srv/salt/_grains - директория, содержащая скрипты для добавления пользовательских grains на клиенте.

Файлы обновлений

Самыми важными компонентами системы являются файлы, связанные с обновлением тонких клиентов.

  1. Зайдите на сервер SaltMaster'а;

  2. Перейти в директорию /srv/salt/states;

  3. В этой директории находятся 4 файла, предназначенных для обновления клиентов:

  • request-update.sls - файл, вызывающий в GUI окно для получения прав пользователя и запуска обновления;

  • update.sls - файл, который вначале вызывает patch.sls, а потом update-last-stateapply;

  • patch.sls - файл, который содержит основную логику по обновлению тонкого клиента;

  • update-last-stateapply.sls - файл, обновляющий дату последнего успешного обновления.

Сценарии обновления клиентов

Обновление после запуска клиента (базовый)

  1. Клиент подключается к salt-master (например, после перезапуска salt-minion сервиса);

  2. Появляется событие о том, что minion запустился;

  3. Reactor в ответ на предыдущее событие вызывает highstate для клиента - minion применяет состояние top.sls;

  4. top.sls применяет состояние request-update.sls;

  5. request-update.sls запрашивает credentials пользователя, если ему не хватает прав, и применяет update.sls.

Обновление через web-application

На одном клиенте:

  1. Заходим на страницу TKControl.

  2. Переходим во вкладку /hosts.

  3. Выбираем необходимого minion и нажимаем кнопку "Upgrade".

  4. Клиент применяет состояние request-update.sls.

На группе клиентов:

  1. Заходим на страницу TKControl.

  2. Переходим во вкладку /groups.

  3. Выбираем необходимую группу и нажимаем кнопку "Upgrade".

  4. Клиенты, принадлежащие группе, применяют request-update.sls.

Обновление через salt-master

  1. Заходим на salt-master.

  2. Выполняем команду:

    sudo salt 'minion_id' state.apply #применяется `top.sls`
    sudo salt 'minion_id' state.apply update.sls #применяется update напрямую, без запрашивания прав.
    

Пример создания патча

Обо всех функциональных возможностях при написании состояний, можно узнать в документации SaltStack https://docs.saltproject.io/en/latest/contents.html

Для создания патча добавим следующий блок в файл patch.sls:

patch-2:
  cmd.run:
    - name: "touch /tmp/readme.txt"

Этот патч создает readme.txt файл в директории /tmp.

Запустим применение патча через salt-master:

sudo salt 'skupov-stagin-tkcontrol-client' state.apply

Заполним форму на клиенте и нажмем OK.

Результат исполнения можно увидеть во вкладке "Недавние действия" (/actions).

Добавим еще один блок в файл patch.sls и намеренно вызовем ошибку:

patch-3:
  cmd.run:
    - name: "exit 1"

Запустим применение патча через salt-master:

sudo salt 'skupov-stagin-tkcontrol-client' state.apply

Заполним форму на клиенте и нажмем OK.

Результат исполнения можно увидеть во вкладке "Недавние действия" (/actions).

Так как обновление завершилось с ошибкой, то оно сохраняется, как неудачное обновление.

Результат неудачного обновления можно увидеть во вкладке "Неудачные обновления" (/failed-updates).

Нажмите на кнопку "Информация". Будет выведен подробный и последовательный ход исполнения обновления.

Значение "Проблема" в колонке "Состояние" означает, что последний запуск обновления на данном хосте выполнился неудачно.

Исправим проблему и еще раз запустим применение обновления.

Замените команду "exit 1" на "exit 0" в блоке patch-3:

patch-3:
  cmd.run:
    - name: "exit 0"

Запустим применение патча через salt-master:

sudo salt 'skupov-stagin-tkcontrol-client' state.apply

Заполним форму на клиенте и нажмем OK.

Результат исполнения можно увидеть во вкладке "Недавние действия" (/actions).

Так как обновление завершилось удачно, то это обновление не появится во вкладке "Неудачные обновления". Но теперь для прошлого неудачного обновления значение в колонке "Состояние" поменялось с "Проблема" на "Исправлено". Это означает, что последнее выполненное обновление на клиенте выполнилось удачно.

Мы сейчас рассмотрели создание небольшого патча, но часто на практике приходится создавать много отдельных патчей, и лучше всего хранить и изменять их отдельно.

Для этого:

# Удалим текущий патч
sudo rm patch.sls

# Создадим директорию для патчей
sudo mkdir patch

# Добавим файл с непосредственным патчем
cat <<EOF | sudo tee patch/patch-1.sls
patch-1:
  cmd.run:
    - name: "echo Multifiles Patch!"
EOF

# Добавим init файл
cat <<EOF | sudo tee patch/init.sls
include:
  - patch/patch-1
EOF

Запустим применение патча через salt-master:

sudo salt 'skupov-stagin-tkcontrol-client' state.apply

Заполним форму на клиенте и нажмем OK.

Результат исполнения можно увидеть во вкладке "Недавние действия" (/actions).