Создание патча для тонких клиентов
Все возможности, которые есть в TKControl, реализованы на основе SaltStack, поэтому для написания собственных наработок и использования предложенных решений, необходимо ознакомиться с документацией SaltStack.
Основные компоненты SaltStack
Вся основная логика по взаимодействию с клиентами содержится на сервере SaltMaster в директории /srv/salt` и файле `/etc/salt/master.d/reactor.conf:
/etc/salt/master.d/reactor.conf - файл, декларирующий реакции, которые должны произойти при определенных событиях;
/srv/salt/pillar - директория, содержащая переменные, которые устанавливаются на клиенте, перед выполненим какого-либо действия;
/srv/salt/states - директория, содержащая состояния, которые могу применяться на клиенте;
/srv/salt/reactor - директория, содержащая состояния реакций на определенные события;
/srv/salt/_grains - директория, содержащая скрипты для добавления пользовательских grains на клиенте.
Файлы обновлений
Самыми важными компонентами системы являются файлы, связанные с обновлением тонких клиентов.
Зайдите на сервер SaltMaster'а;
Перейти в директорию /srv/salt/states;
В этой директории находятся 4 файла, предназначенных для обновления клиентов:
request-update.sls - файл, вызывающий в GUI окно для получения прав пользователя и запуска обновления;
update.sls - файл, который вначале вызывает patch.sls, а потом update-last-stateapply;
patch.sls - файл, который содержит основную логику по обновлению тонкого клиента;
update-last-stateapply.sls - файл, обновляющий дату последнего успешного обновления.
Сценарии обновления клиентов
Обновление после запуска клиента (базовый)
Клиент подключается к salt-master (например, после перезапуска salt-minion сервиса);
Появляется событие о том, что minion запустился;
Reactor в ответ на предыдущее событие вызывает highstate для клиента - minion применяет состояние top.sls;
top.sls применяет состояние request-update.sls;
request-update.sls запрашивает credentials пользователя, если ему не хватает прав, и применяет update.sls.
Обновление через web-application
На одном клиенте:
Заходим на страницу TKControl.
Переходим во вкладку /hosts.
Выбираем необходимого minion и нажимаем кнопку "Upgrade".
Клиент применяет состояние request-update.sls.
На группе клиентов:
Заходим на страницу TKControl.
Переходим во вкладку /groups.
Выбираем необходимую группу и нажимаем кнопку "Upgrade".
Клиенты, принадлежащие группе, применяют request-update.sls.
Обновление через salt-master
Заходим на salt-master.
Выполняем команду:
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).