Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
develop:pyton:practics [2024/03/08 10:41] admin [Overall] |
develop:pyton:practics [2024/07/15 05:32] (текущий) admin |
||
---|---|---|---|
Строка 79: | Строка 79: | ||
===== Diagrams ===== | ===== Diagrams ===== | ||
- | |||
< | < | ||
< | < | ||
Строка 229: | Строка 228: | ||
===== Модули для Ansible ===== | ===== Модули для Ansible ===== | ||
- | |||
Располагаем **py** файлы по пути например " | Располагаем **py** файлы по пути например " | ||
Строка 285: | Строка 283: | ||
+ | ===== Скрины из заббикса===== | ||
- | ===== Overall ===== | + | Для получения графиков изображением есть несколько php скриптов (**"/ |
+ | * **chart.php** - рисует график по переданному массиву " | ||
+ | * **chart2.php** - простой график по graphID (chart6.php тоже самое только круговой) | ||
+ | * **chart4.php** - рисует график по триггеру, | ||
+ | Организация простая, | ||
+ | < | ||
+ | < | ||
+ | <code python> | ||
+ | # Простой график | ||
+ | http:// | ||
+ | http:// | ||
+ | http:// | ||
+ | # Триггер | ||
+ | http:// | ||
+ | # Массив итемов | ||
+ | http:// | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code python> | ||
+ | # | ||
+ | """ | ||
+ | Графики для поиска перечислены в конфиге, | ||
+ | Заббикс группа передается в аргументе, | ||
+ | Изображение сохраняется в этой же директории, | ||
+ | |||
+ | Требуются пакеты: | ||
+ | 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(" | ||
+ | args = arg_parser.parse_args() | ||
+ | if not args.c: | ||
+ | print(" | ||
+ | exit(1) | ||
+ | |||
+ | # Принимаем только цифро-буквы и нижнее подчеркивание | ||
+ | args.c = re.sub(' | ||
+ | |||
+ | # Так же меняем префикс в имени кластера | ||
+ | name_zabbix_group = args.c.replace(" | ||
+ | |||
+ | # Получаем перечень ИД графиков, | ||
+ | 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 = """ | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | }, " | ||
+ | |||
+ | answer = requests.post(f' | ||
+ | |||
+ | if answer.status_code != 200: | ||
+ | print(f" | ||
+ | return [] | ||
+ | else: | ||
+ | # В результатах созвращается список словарей, | ||
+ | list_graphs_ids= [item[' | ||
+ | return list_graphs_ids | ||
+ | |||
+ | |||
+ | def get_id_zabbix_group(name_zabbix_group): | ||
+ | """ | ||
+ | """ | ||
+ | query = """ | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | }, " | ||
+ | answer = requests.post(f' | ||
+ | |||
+ | if answer.status_code == 200 and len(answer.json()[' | ||
+ | return answer.json()[' | ||
+ | else: | ||
+ | print(f" | ||
+ | return "" | ||
+ | |||
+ | |||
+ | def get_screen_image(list_id_graphs): | ||
+ | """ | ||
+ | """ | ||
+ | # Получаем куки авторизации, | ||
+ | data_api = {" | ||
+ | cookie = requests.post(f" | ||
+ | |||
+ | # Объект для итогового изображения, | ||
+ | # Ширина множится на два т.к. графики в два столбца | ||
+ | # Высота - сумма всех, деленная на два т.к. в два столбца | ||
+ | screen_image = Image.new(" | ||
+ | y_coordinate = 0 | ||
+ | x_coordinate = 0 | ||
+ | |||
+ | # Обходим список ИД графиков, | ||
+ | for id_graph in list_id_graphs: | ||
+ | graph_image_bytes = get_graph_image(id_graph, | ||
+ | if len(graph_image_bytes) == 0: | ||
+ | continue | ||
+ | |||
+ | # Ресайзим картинку и добавляем в общий коллаж | ||
+ | graph_image = Image.open(io.BytesIO(graph_image_bytes)).resize((settings.graph_width, | ||
+ | screen_image.paste(graph_image, | ||
+ | |||
+ | # Устанавливаем координаты вставки для следующего изображения | ||
+ | if x_coordinate == 0: | ||
+ | x_coordinate = settings.graph_width | ||
+ | else: | ||
+ | x_coordinate = 0 | ||
+ | y_coordinate += settings.graph_height | ||
+ | |||
+ | # Сохраняем итоговое, | ||
+ | # Надобности хранить изображения нет, они сразу забираются | ||
+ | # Есть надобность удалять старые | ||
+ | # Выбран вариант перезаписывать один и тот же файл | ||
+ | img_file_name = " | ||
+ | screen_image.save(img_file_name) | ||
+ | return img_file_name | ||
+ | |||
+ | |||
+ | def get_graph_image(id_graph, | ||
+ | """ | ||
+ | """ | ||
+ | answer = requests.get(f" | ||
+ | |||
+ | # Возвращаем `content` только если код ответа успешный, | ||
+ | if answer.status_code == 200: | ||
+ | return answer.content | ||
+ | else: | ||
+ | print(f" | ||
+ | return "" | ||
+ | |||
+ | |||
+ | if __name__ == " | ||
+ | main() | ||
+ | </ | ||
+ | |||
+ | 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 }}' | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Overall ===== | ||
< | < | ||
< | < | ||
Строка 330: | Строка 519: | ||
# | # | ||
print(' | print(' | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | |||
+ | <code python> | ||
+ | from PIL import ImageFont | ||
+ | |||
+ | font_path = " | ||
+ | font_size=300 | ||
+ | |||
+ | ttf = ImageFont.truetype(font_path, | ||
+ | |||
+ | txt = "Hello World!" | ||
+ | w, h = ttf.getsize(txt) | ||
+ | print(w, h) | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | |||
+ | <code python> | ||
+ | longest_word = max(text_in_node.split(), | ||
</ | </ | ||
</ | </ | ||
Строка 343: | Строка 560: | ||
+ | |||
+ | < | ||
+ | < | ||
+ | |||
+ | <code python> | ||
+ | </ | ||
+ | </ | ||
===== ===== | ===== ===== |