суббота, 9 декабря 2017 г.

Визуализация отчетов биллинга Google Cloud Platform

GCP позволяет получать ежедневные отчеты по биллингу в любой бакет проекта.
Это описано в документации: https://cloud.google.com/billing/docs/how-to/export-data-file
Полученный файл имеет формат CSV, который можно смотреть например в LibreOffice Calc.
Для визуализации и фильтрации таких отчетов я сделал небольшой проект, с помощью которого можно просматривать отчеты в удобочитаемом виде, при этом они генерируются автоматически по крону.

Настройка эта очень простая, сам проект находится тут: https://github.com/Amet13/gcloud-billing-visualize

Выглядит это примерно так:

воскресенье, 26 ноября 2017 г.

Где найти образы виртуальных машин (raw/qcow2)?

Вот тут актуальная информация, где можно найти образы ОС для развертывания виртуальных машин: https://docs.openstack.org/image-guide/obtain-images.html
Они могут пригодиться для KVM, OpenStack и прочего. В основном образы в формате img и qcow2.
Ссылка вряд ли будет меняться, а содержимое доки будет пополняться, поэтому не дублирую сюда.

Там же в документации описано, как такие образы можно собирать, конвертировать форматы и прочее. Полезная штука, тем кто будет заниматься развертыванием виртуалок на KVM например.

пятница, 10 ноября 2017 г.

ClamAV: lstat() failed: Permission denied

При попытке отправить письмо в связке с Exim+ClamAV появилась такая ошибка:
malware acl condition: clamd: ClamAV returned: /var/spool/exim4/scan/id.eml: lstat() failed: Permission denied. ERROR​

Фиксится это правкой конфигов:
/etc/clamav/freshclam.conf
/etc/clamav/clamd.conf

директивой:
AllowSupplementaryGroups yes

четверг, 2 ноября 2017 г.

Визуализируем карту мира с highcharts

Просматривая на просторах интернета список стран, в которые нужна или не нужна виза я повсюду натыкался на информацию в виде списка стран, пример: https://www.passportindex.org/comparebyPassport.php?p1=ru&fl=&s=yes. Мне казалось что просматривать такое удобно в виде карты.
Так как на сайте passportindex информация обновляется довольно оперативно, то я решил стягивать оттуда актуальную информацию по визам и странам и визуализировать это в виде карты мира.

вторник, 3 октября 2017 г.

Error: Could not initialize class sun.security.ec.SunEC

При запуске selenium на одной из нод со старой версией ОС (Fedora 22) столкнулся с тем, что selenium работает некорректно:
ERROR: Could not initialize class sun.security.ec.SunEC
phantomjs
Error: Could not initialize class sun.security.ec.SunEC

Версия java вполне себе свежая:
# java -version
openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)

Однако тут есть один момент.
В относительно новых версиях JDK, SunEC был удален и заменен на nss, поэтому nss нужно обновить, в моем случае на последнюю версию из репозитории Fedora:
# dnf list installed | grep ^nss.x86_64
nss.x86_64      3.19.2-1.0.fc22     @System
# dnf update nss
# dnf list installed | grep ^nss
nss.x86_64      3.23.0-1.0.fc22     @System

После этого ошибка исчезла с новой версией nss.

via.

четверг, 14 сентября 2017 г.

Нотификации об ошибках в Redis-кластере с помощью Sentinel и Slack

На самом деле можно куда угодно слать уведомление, хоть в систему мониторинга, хоть на почту. Я отправляю в Slack.

Вот как выглядит скрипт отправки сообщения:
# vim /srv/sentinel_notification.bash
#!/bin/bash

SLACK_URL=https://hooks.slack.com/services/12345 # your webhook url

if [ "$#" = "2" ]; then
SLACK_BODY=`cat << EOB
=====================================
Information about your Redis Cluster.
Check Redis server or sentinel.
=====================================
Event type: ${1}
Event description: ${2}

Message sent by Sentinel Notification feature.

EOB`
    curl -X POST --data-urlencode "payload={\"channel\": \"#monitoring\", \"username\": \"Redis Sentinel from dbs\", \"text\": \"\`\`\`$SLACK_BODY\`\`\`\"}" $SLACK_URL
fi

Делаем скрипт исполняемым:
# chmod +x /srv/sentinel_notification.bash

В конфиг sentinel прописываем наш скрипт:
# vim /etc/redis-sentinel.conf
....
sentinel notification-script mymaster /srv/sentinel_notification.bash
...

Рестартим сервис:
# systemctl restart redis-sentinel

Вот пример того, как выглядит сообщение в Slack:

Список всех event type можно посмотреть в документации: https://redis.io/topics/sentinel#pubsub-messages

пятница, 4 августа 2017 г.

Особенность при использовании Ansible Python API с Celery

В приложении, которое использует Python API ансибла и запускается с помощью Celery была обнаружена особенность, при которой ансибловский плейбук не отрабатывает и возвращает пустой результат:
# cat ansible.log
2017-08-02 16:02:08,764 --- INFO --- utils run():87 --- Playbook load
2017-08-02 16:02:08,868 --- INFO --- utils run():94 --- Playbook run
2017-08-02 16:02:08,870 --- DEBUG --- utils run():96 --- Options: Options(connection='ssh', module_path='', forks=100, become=True, become_method='sudo', become_user='root', check=False, remote_user='root')
2017-08-02 16:02:09,328 --- DEBUG --- utils run():108 --- 0

Если же этот плейбук запускать руками напрямую, а не через Ansible, то все нормально.

Ошибка заключается в том, что Celery почему-то не может взаимодействовать с ResultCallback функцией Ansible Python API.
Решение такое, перед запуском Celery-воркера нужно задать переменную:
PYTHONOPTIMIZE=1
или запустить Celery c параметром:
-O OPTIMIZATION
После этих манипуляций все работает отлично.

via.

четверг, 3 августа 2017 г.

Генерация конфигурации OpenLDAP + SSSD

Необходимо работающий на сервере LDAP соединить с SSSD, который позволяет подключаться к LDAP, как локально, так и удаленно.
Представим что LDAP-server уже настроен и отзывается на команду:
# ldapsearch -D cn=Manager,dc=domain,dc=com -H ldaps://localhost:636 -b ou=it,dc=domain,dc=com -w

вторник, 25 июля 2017 г.

Некоторые общие проблемы с cron

Наиболее популярным планировщиком заданий в Linux является демон cron.
Демон сервиса под названием crond читает файлы конфигураций (/etc/crontab, /etc/cron.*, /var/spool/cron) и выполняет запланированные задания.

Существуют особенности работы с cron и некоторые сталкиваются с трудностями при его использовании.

пятница, 7 июля 2017 г.

Сборка кроссплатформенного python-инсталлятора с помощью conda constructor

Задача: необходимо собрать минимальное окружение c python 2.7 и gsutil на борту. Окружение должно устанавливаться на Linux, Mac OS X, Windows.
Конечный результат: в каталог файловой системы устанавливаются python и gsutil, который можно использовать без установки системных зависимостей.

Делаю это на основе чистого контейнера с CentOS 7:
# docker run -ti centos bash
# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core)