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

Все возможности, которые есть в 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).