Инструменты пользователя

Инструменты сайта


develop:pyton:practics

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
develop:pyton:practics [2024/03/14 16:31]
admin [Overall]
develop:pyton:practics [2024/07/15 05:32] (текущий)
admin
Строка 79: Строка 79:
  
 ===== Diagrams ===== ===== Diagrams =====
- 
 <details> <details>
 <summary>:!: модуль diagrams </summary> <summary>:!: модуль diagrams </summary>
Строка 229: Строка 228:
  
 ===== Модули для Ansible ===== ===== Модули для Ansible =====
- 
 Располагаем **py** файлы по пути например "**.ansible\collections\ansible_collections\community\general\plugins\modules**" (в целом расположения указываются в конфиге). Тут можно сделать подпапку\\ Располагаем **py** файлы по пути например "**.ansible\collections\ansible_collections\community\general\plugins\modules**" (в целом расположения указываются в конфиге). Тут можно сделать подпапку\\
  
Строка 285: Строка 283:
  
  
 +===== Скрины из заббикса=====
  
-===== Overall =====+Для получения графиков изображением есть несколько php скриптов (**"/usr/share/zabbix/chart*.php"**)\\ 
 +  * **chart.php** - рисует график по переданному массиву "itemids" 
 +  * **chart2.php** - простой график по graphID (chart6.php тоже самое только круговой) 
 +  * **chart4.php** - рисует график по триггеру, статистика 
 +Организация простая, в начале скрипта сразу видно какие параметры принимает, тип, обязательность и т.д.\\
  
 +<details>
 +<summary>:!: Еще работа с заббиксом</summary>
 +<code python>
 +  # Простой график
 +http://10.10.10.10/zabbix/chart2.php?graphid=15155&from=now-7d&to=now
 +http://10.10.10.10/zabbix/chart2.php?graphid=15155&from=now-24h&profileIdx=web.graphs.filter&to=now&width=1301
 +http://10.10.10.10/zabbix/chart2.php?period=from=now-10800&to=now&profileIdx=web.graphs.filter&graphid=15155&name=title&width=900&height=200&graphtype=0&legend=1
 +  # Триггер
 +http://10.10.10.10/zabbix/chart4.php?triggerid=22050
 +  # Массив итемов
 +http://10.10.10.10/zabbix/chart.php?itemids[]=55063&itemids[]=55064
 +</code>
 +</details>
  
 +
 +<details>
 +<summary>:!: Пример скрипта </summary>
 +<code python>
 +#!/usr/bin/python3
 +""" Скрипт для получения изображения графиков заббикса
 +    Графики для поиска перечислены в конфиге, параметр "list_graphs_on_screen"
 +    Заббикс группа передается в аргументе, предполагается кластерная группа, но можно использовать любую существующую
 +    Изображение сохраняется в этой же директории, перезаписывается один и тот же файл
 +
 +Требуются пакеты:
 +    pip install Pillow
 +"""
 +
 +from PIL import Image
 +import requests
 +import json
 +import settings
 +import io
 +import math
 +import argparse
 +import re
 +
 +
 +def main():
 +    arg_parser = argparse.ArgumentParser()
 +    arg_parser.add_argument("-c", type = str, help = "Укажите имя кластера")
 +    args = arg_parser.parse_args()
 +    if not args.c:
 +        print("     Error: Укажите имя кластера для получения графиков")
 +        exit(1)
 +
 +    # Принимаем только цифро-буквы и нижнее подчеркивание
 +    args.c = re.sub('[^\w_]', '', args.c)
 +
 +    # Так же меняем префикс в имени кластера
 +    name_zabbix_group = args.c.replace("cl_", "GSC_")
 +
 +    # Получаем перечень ИД графиков, указанных в конфиге
 +    list_ids_graphs = get_list_id_graphs(name_zabbix_group)
 +
 +    if len(list_ids_graphs) > 0:
 +        # Получаем все изображения, собираем их в одно и сохраняем на диск
 +        image_path = get_screen_image(list_ids_graphs)
 +
 +        # Возвращаем имя файла
 +        print(image_path)
 +
 +
 +def get_list_id_graphs(name_zabbix_group):
 +    """ Здесь получаем перечень ИД графиков, указанного кластера
 +    """
 +    # Сначала узнаем ИД указанной заббикс группы
 +    id_zabbix_group = get_id_zabbix_group(name_zabbix_group)
 +    if len(id_zabbix_group) == 0:
 +        return []
 +
 +    query = """{"jsonrpc": "2.0",
 +        "method": "graph.get",
 +        "params": {
 +            "output": "graphid",
 +            "groupids": \""""+ id_zabbix_group +"""\",
 +            "sortfield": "name",
 +            "sortorder": "DESC",
 +            "filter": {
 +                "name": ["""+ settings.list_graphs_on_screen +"""]
 +            }
 +        }, "auth": \""""+ settings.zabbix_key +"""\","id": 1} """.replace('\n', '')
 +
 +    answer = requests.post(f'http://{settings.zabbix_url}/api_jsonrpc.php', json=json.loads(query))
 +
 +    if answer.status_code != 200:
 +        print(f"ZabbixAPI: Не удалось получить ответ от заббикса, ошибка: {answer.status_code}")
 +        return []
 +    else:
 +        # В результатах созвращается список словарей, с ключ-значение, нам нужен только список значений
 +        list_graphs_ids= [item['graphid'] for item in answer.json()['result']]
 +        return list_graphs_ids
 +
 +
 +def get_id_zabbix_group(name_zabbix_group):
 +    """ Получаем ИД заббикс группы по имени переданного кластера
 +    """
 +    query = """{"jsonrpc": "2.0",
 +        "method": "hostgroup.get",
 +        "params": {
 +            "output": "groupid",
 +            "filter": {
 +                "name": \""""+ name_zabbix_group +"""\"
 +            } 
 +        }, "auth": \""""+ settings.zabbix_key +"""\","id": 1} """.replace('\n', '')
 +    answer = requests.post(f'http://{settings.zabbix_url}/api_jsonrpc.php', json=json.loads(query))
 +
 +    if answer.status_code == 200 and len(answer.json()['result']) > 0:
 +        return answer.json()['result'][0]['groupid']
 +    else:
 +        print(f"ZabbixAPI: Ответ от заббикса пуст, код ответа: {answer.status_code}")
 +        return ""
 +
 +
 +def get_screen_image(list_id_graphs):
 +    """ Из переданного списка графиков собираем общий коллаж
 +    """
 +    # Получаем куки авторизации, здесь, чтобы не вызываться в цикле
 +    data_api = {"name": settings.zabbix_user, "password": settings.zabbix_passwd, "enter": "Sign in"}
 +    cookie = requests.post(f"http://{settings.zabbix_url}/", data = data_api).cookies
 +
 +    # Объект для итогового изображения, размер задается сразу
 +        # Ширина множится на два т.к. графики в два столбца
 +        # Высота - сумма всех, деленная на два т.к. в два столбца
 +    screen_image = Image.new("RGBA", ((settings.graph_width * 2), (settings.graph_height * math.ceil(len(list_id_graphs) / 2))))
 +    y_coordinate = 0
 +    x_coordinate = 0
 +
 +    # Обходим список ИД графиков, получаем изображение каждого
 +    for id_graph in list_id_graphs:
 +        graph_image_bytes = get_graph_image(id_graph, cookie)
 +        if len(graph_image_bytes) == 0:
 +            continue
 +
 +        # Ресайзим картинку и добавляем в общий коллаж
 +        graph_image = Image.open(io.BytesIO(graph_image_bytes)).resize((settings.graph_width, settings.graph_height))
 +        screen_image.paste(graph_image, (x_coordinate, y_coordinate))
 +
 +        # Устанавливаем координаты вставки для следующего изображения
 +        if x_coordinate == 0:
 +            x_coordinate = settings.graph_width
 +        else:
 +            x_coordinate = 0
 +            y_coordinate += settings.graph_height
 +
 +    # Сохраняем итоговое, общее изображение
 +        # Надобности хранить изображения нет, они сразу забираются
 +        # Есть надобность удалять старые
 +        # Выбран вариант перезаписывать один и тот же файл
 +    img_file_name = "zabbix_screen_image.png"
 +    screen_image.save(img_file_name)
 +    return img_file_name
 +
 +
 +def get_graph_image(id_graph, cookie):
 +    """ Получаем из заббикса изображение указанного ИД графика
 +    """    
 +    answer = requests.get(f"http://{settings.zabbix_url}/chart2.php?graphid={id_graph}&legend=1", cookies = cookie, verify = False)
 +
 +    # Возвращаем `content` только если код ответа успешный, в противном случае пустую строку
 +    if answer.status_code == 200:
 +        return answer.content
 +    else:
 +        print(f"ZabbixAPI: Не удалось получить изображение, ошибка: {answer.status_code}")
 +        return ""
 +
 +
 +if __name__ == "__main__":
 +    main()
 +</code>
 +
 +settings.py
 +<code python>
 +zabbix_url = '{{ slack_notify_zabbix_url }}'
 +list_graphs_on_screen = '{{ slack_notify_graphs_on_screen }}'
 +graph_width = {{ slack_notify_graph_width }}
 +graph_height = {{ slack_notify_graph_height }}
 +zabbix_user = '{{ slack_notify_zabbix_user }}'
 +zabbix_passwd = '{{ slack_notify_zabbix_passwd }}'
 +zabbix_key = '{{ slack_notify_zabbix_key }}'
 +</code>
 +</details>
 +
 +
 +
 +
 +===== Overall =====
 <details> <details>
 <summary>:!: Сортировка</summary> <summary>:!: Сортировка</summary>
develop/pyton/practics.1710433876.txt.gz · Последнее изменение: 2024/03/14 16:31 — admin