В данной статье хотел бы рассказать об отправке уведомлений в Telegram чат при использовании SaltStack. Начиная с версии 2015.5.0, SaltStack предоставляет интеграцию со Slack из коробки, однако Telegram также является популярным мессенджером и активно используется среди российских пользователей. Поэтому надеюсь, что статья окажется полезна ее читателям.
Введение
Вообще говоря, SaltStack представляет собой конструктор и, как и многие другие инструменты, предоставляет возможности для кастомизации и расширения. В частности, собственные исполняемые модули.
О том, как можно создать Telegram бота на Python подробно рассказывается здесь. В качестве дополнения будет описано, как, используя небольшой Python-модуль, такой подход можно привязать к SaltStack.
Процесс настройки
Приступать к написанию модуля следует после того, как:
- Создан бот
- Бот дабавлен в чат
- Получен chat_id
Примечание. Получить id чата можно с помощью следующего скрипта на python:
import requests
URL = 'https://api.telegram.org/bot'
TOKEN = <токен вашего бота>
try:
request = requests.post('{url}{token}/getUpdates'.format(url=URL, token=TOKEN))
print request.json()['result'][0]['message']['chat']['id']
except Exception,e:
print str(e)
Итак, переходим к главному. Как описано в документации, SaltStack модуль должен располагаться в директории _modules/
и выглядеть следующим образом:
import requests
URL='https://api.telegram.org/bot'
def notify(message, token, chat_id):
message_data = {
'chat_id': chat_id,
'text': message
}
try:
request = requests.post('{url}{token}/sendMessage'.format(url=URL, token=token), data=message_data)
except Exception,e:
return False, str(e)
if not request.status_code == 200:
return False, "Return status is unsuccessful"
# для наглядности вторым значением возвращается строка со служебной информацией.
return True, "Message was successfully sent"
Далее необходимо выполнить команду синхронизации модулей, чтобы они появились на миньонах:
salt '*' saltutil.sync_modules
Если все завершилось успешно, результат будет примерно следующим:
И, напоследок, создаем файл состояния (в данном примере — send_telegram.sls
)
send message about minion id:
module.run:
# telegram - имя python-модуля, notify - метод в этом модуле
- name: telegram.notify
- kwargs:
message: command executed on minion with id {{ grains['id'] }}
token: <токен вашего бота>
chat_id: <id чата в Telegram>
Проверяем работоспособность созданного модуля:
salt '*' state.apply send_telegram
На стороне мастера:
В чате:
Источники
- Телеграм бот на Python с использованием только requests
- Writing execution modules
- How do I use salt states?
farcaller
А в чем смысл модуля, который шлет уведомления в телеграм? Может вам returner проще было бы сделать?
SirEdvin
Зависит от того, что делать через saltstack. Если на нем завязан деплой на тест, то почему бы и нет?
tikhoa
К тому же может понадобиться расширить модуль и использовать другие возможности API.
farcaller
не совсем понимаю. То что вы делаете сейчас — это исключительно уведомительная вещь, нет? Тогда вам проще просто дергать "чистый" state, и через returner возврящать статус в человеко-читаемом виде в телеграм.
SirEdvin
Я плохо знаю salt, но тут имеется ввиду отправить сообщение в духе "деплой закончен". Зачем вам тут state?
farcaller
а как вы деплоите в принципе?
state.apply
на sls? илиorchestrate
?tikhoa
Мне кажется оба варианта удобны. Единственное, если у вас стэйт файл состоит из нескольких шагов, с помощью модуля возможна отсылка уведомлений по завершению каждого из них. Насчёт returner'а не уверен.