- PVSM.RU - https://www.pvsm.ru -

Интеграция SaltStack и Telegram

image
В данной статье хотел бы рассказать об отправке уведомлений в Telegram чат при использовании SaltStack. Начиная с версии 2015.5.0, SaltStack предоставляет интеграцию со Slack из коробки, однако Telegram также является популярным мессенджером и активно используется среди российских пользователей. Поэтому надеюсь, что статья окажется полезна ее читателям.

Введение

Вообще говоря, SaltStack представляет собой конструктор и, как и многие другие инструменты, предоставляет возможности для кастомизации и расширения. В частности, собственные исполняемые модули [1].
О том, как можно создать Telegram бота на Python подробно рассказывается здесь [2]. В качестве дополнения будет описано, как, используя небольшой Python-модуль, такой подход можно привязать к SaltStack.

Процесс настройки

Приступать к написанию модуля следует после того, как:

  1. Создан бот
  2. Бот дабавлен в чат
  3. Получен 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)

Итак, переходим к главному. Как описано в документации [1], 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

Если все завершилось успешно, результат будет примерно следующим:
image

И, напоследок, создаем файл состояния (в данном примере — 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

На стороне мастера:
image

В чате:
image

Источники

  1. Телеграм бот на Python с использованием только requests [2]
  2. Writing execution modules [1]
  3. How do I use salt states? [3]

Автор: Анатолий

Источник [4]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/256986

Ссылки в тексте:

[1] исполняемые модули: https://docs.saltstack.com/en/latest/ref/modules/

[2] здесь: https://habrahabr.ru/post/322050/

[3] How do I use salt states?: https://docs.saltstack.com/en/latest/topics/tutorials/starting_states.html

[4] Источник: https://habrahabr.ru/post/330028/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best