воскресенье, 26 декабря 2021 г.

iOS Shortcuts | SSH-based автоматизация

У меня iPhone и iPad. Прошу прощения, если расстроил. ) А еще я очень люблю Shortcuts.

Для тех, кто не знает, Shortcuts это платформа для автоматизации от Apple. В ней можно реализовать как совсем простые задачи (включить DND в какое-то определенное время или в определенном месте), так и что-то посложнее. Например, я парсил веб-страничку каждый день и отправлял уведомление при ее изменении. Инструмент безусловно интересный, хоть и немного урезанный в некоторых моментах. 

Сегодня попробуем "написать" некое приложение для управления устройствами по SSH. В качестве  примера реализуем накатывание апдейтов. 

В конце статьи пара коротких видео.

Вообще у меня уже было несколько подобных "шорткатов", но на это раз сделаем шаг назад и попробуем все сделать как надо.

Дизайн

Для достижения желаемой модульности разобьем весь код на отдельные "функции". 

Например, у нас будет функция для выполнения SSH команд на устройстве _run-script, которая ожидает имя хоста и сам текст для выполнения. Всю логику для генерации самих команд выносим в отдельные модули. Скажем, для определения семейства системы мы будем использовать функцию _get-family. Она по сути посто генерирует нужную команду и выполняет _run-script.

Такая же история  с _run-upgrade, которая будет использовать _get-family для определения семейства системы и будет запускать _run-script для запуска обновления. В общем, тут работают все те же правила, которые работают в любом языке программирования.

Я решил вынести итерации в отдельный "модуль". Поэтому у нас имеется _iterate-upgrades, которые по-просту запускает _run-upgrade для каждого хоста в списке. 

Инвенторные данные будем хранить в отдельном json'чике. Можно в дальнейшем расширить функционал, но сейчас это просто словарик с адресами.

Забегая немного вперед скажу, что все удалось довольно легко реализовать.

А, забыл сказать. Очевидно данный "фреймворк" будет конкурировать со всеми именитыми решениями, в том числе и с Salt. Поэтому я назвал свой проект Sugar. В одноименном файлике будет храниться некое подобие UI для запуска заданий на определенных хостах.

Ладно, пройдемся по всем файликам снизу вверх.

_run-script

Файл тут. Не забудьте поменять метод автотризации на KeyBased как на картинке внизу.


"Шорткат" ожидает словарик на входе. В нем хост и скрипт для выполнения. Сама логика тут проста. Вынимаем из словаря host и script и присваиваем их к переменным. Вообще, это необязательно, но повышает читаемость. Далее запускаем скрипт на хосте средствами Run script over SSH.

Важный момент - аутентификация происходит по ключам. При нажатии на сам ключ в последнем шаге можно его скопировать. Далее нужно добавить его на хосты в .ssh/authorized_keys.

Наш шорткат не предназначен для запуска напрямую. Поэтому добавляем в начало такую вот конструкцию.

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


_get-family

Файл тут.


Важная часть функционала. Ведь нам нужно знать чем обновлять систему. В моем случае это apt-get или yum, но функционал легко будет расширить.

Что касается кода. Генерируем команду для исполнения, а именно парсим os-release файлик (первое что пришло в голову). Далее просто собираем словарик нужного формата и запускаем _run-script. Первый пример модульности. 

В начале скрипта есть аналогичная конструкция с коротким хелпом, как и в прошлом скрипте. Я её тут не показываю. Скрипт ожидает только хост для подключения.

_run-upgrade

Файл тут.


В Shortcuts нет elif конструкции, поэтому if else могут выглядеть немного странно.

В файлике выше, мы ожидаем только имя хоста или адрес. Далее, определяем семейство хоста и на его основе генерируем нужную команду для обновления. 


Далее, просто запускаем run-script и передаем в него словарик с хостом и текстом для исполнения. Все очень просто. 

_iterate-upgrades

Файл тут.


Тут у нас простой файлик, который ожидает список адресов на входе и запускает предыдущий скрипт для каждого из них.

create-inventory

Файл тут.


Для того чтобы создать инвенторный файл в нужном формате и в нужном месте я предоставляю специальную утилиту. Просто наполните словарик в файле своими данными и выполните скрипт. 

И да, у меня везде хитрые имена хостов.


Sugar UI

Файл тут.


Это вершина всего этого бутерброда. Здесь мы открывает файл с инвентори и вытаскиваем из него словарь.

Далее мы достаем все ключи (имена хостов) и предлагаем пользователю выбрать какие из них его сейчас интересуют. Далее для каждого имени достаем адрес для подключения и собираем все это в список. 


Даем пользователю выбрать одну из операций. Пока что это только обновление OS. Ну и запускаем наш шорткат для обновления хостов из списка.

Далее небольшой пример работы. К сожалению, все мои хосты уже обновлены, но скрипт наш фреймворк работает корректно.


Расширяем функционал

Теперь я покажу как пользователи могут легко добавлять свой функционал. Например, мы хотим собирать аптайм с серверов. Нет ничего проще! Sugar позволяет сделать это. Все что нам нужно, это создать два файла.

_get-uptime

Файл тут.


Это мы уже видели. Почти полная копия _get-family, различается только команда для выполнения.

_iterate-uptime

Файл тут.


Опять же, принцип нам знаком. Единственное отличие здесь это сбор всех результатов выполнения команд в один репорт.

Далее нам нужно лишь внести изменения в Sugar UI.


И вуаля! Теперь мы можем собирать еще и аптайм!


Серьезно?

Ладно-ладно, довольно сложно найти оправдание такой "дичи", но давайте попробуем взглянуть на это с другой стороны.

  • Да, это не Salt и не Ansible, но это запускается на вашем телефоне! И оно работает!
  • Более того, мы можем запускать это через Siri ) Или по какому-то событию, например. Если включить фантазию еще больше, то можно, скажем, за 2 минуты настроить SMS уведомления. 
  • Это самая настоящая автоматизация и с этим сложно спорить. Порог вхождения просто минимальный. Функционал не богат, но достаточен. Как вариант можно запускать уже заранее написанные скрипты прям на хостах. Хочу подчеркнуть, что мы имеем возможность выполнять bash скрипты, я же по сути просто отправлял отдельные команды.
  • Нам удалось реализовать модульность, что действительно позволяет расширять функционал.
  • Это был довольно занятное упражнение, которое заставило меня хорошенько подумать над дизайном перед реализацией. Однако результат меня удивил и приятно порадовал.
Автоматизируйте, друзья мои! )

Комментариев нет:

Отправить комментарий