Создание патча для тонких клиентов¶
Все возможности, которые есть в TKControl, реализованы на основе 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).