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

Для чего может быть понадобится делать столь странные вещи? Например, одной из причин может быть использование стека приема метрик на базе graphite (т.е. push метрик вместо pull). Это конечно, менее молодежно, чем prometheus, но все равно имеет право на жизнь :).  В нашем случае может существовать некий софт, который заточен отдавать свои метрики для prometheus. Мне, в частности, встретился такой на пути - minio  (https://github.com/minio/minio). Вот и будем рассматривать на его примере.

    Почему просто не поднять prometheus и жить с двумя системами мониторинга? Мой ответ:  тогда prometheus надо бекапить(метрики), настраивать свою систему алертинга, в графане использовать еще один datasource. Зачем это делать, если уже все это реализовано  в своем стеке?  Можно prometheus  использовать просто как некий переходник. Для решения данной задачи могут подойти 2 продукта:

  • graphite-remote-adapter (https://github.com/criteo/graphite-remote-adapter)
  • telegraf - не проверял, но говорят у него можно использовать prometheus как input, а graphite - как output.

 

    Чтобы восстановить moira из бекапа - нет ничего сложного: берем дамп редиса и переносим на другую машину. Некоторая особенность может быть с тем, что в развернутом бекапе могут отсутствовать настроенные notifications (сами триггеры на месте). Это все из-за security модели moira - https://moira.readthedocs.io/en/latest/installation/security.html и заголовка X-WebAuth-User.

Если виртуальный хост например имел такой вид:

server_name moira.test.ru;
listen 80;

location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_read_timeout 120;
    proxy_set_header Host            moira.test.ru;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-WEBAUTH-USER  $cwd_user;
    proxy_set_header Authorization   '';
    ...
}

 где $cwd_user - это переменная, которая передается при crowd авторизации, соответственно, если  в новой moira начнем передавать в данном заголовке другое значение (нет crowd авторизации или предполагается передавать  в заголовке X-WEBAUTH-USER всегда одно значение ), то потеряем все настройки notifications и subscriptions. Как же можно восстановить все подписки  и уведомления? Достаточно заглянуть в дамп редиса следующим запросом:

redis-cli --scan --pattern 'moira-user-*'
moira-user-subscriptions:test1
moira-user-contacts:test1
moira-user-contacts:test2
moira-user-contacts:test3
moira-user-subscriptions:test2
moira-user-subscriptions:test3

Зная возможные значения moira-user-contacts, можно передавать их значения в заголовке X-WEBAUTH-USER, тем самым восстановить notifications и subscriptions.

В сети есть некоторое количество информации о том как две указанные вещи можно связать:

https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.vault.html

https://support.saltstack.com/Third-party_Solutions/HashiCorp/Quick_Guide_to_Vault_Integration

https://medium.com/@aratik711/saltstack-and-vault-integration-20eeb2e7ec9c

https://backbeat.tech/blog/secure-servers-with-saltstack-and-vault-part-2/

Интеграция предполагает множество вариантов, в которых не так-то просто и разобраться.

Речь о проекте https://github.com/moira-alert/moira - системе алертинга для graphite monitoring (как alertmanager у prometheus). Небольшая заметка по advaced trigger: в документации есть совсем немного примеров по их использованию - https://moira.readthedocs.io/en/latest/user_guide/advanced.html. Там приведен один пример и идет отсылка к чтению https://github.com/Knetic/govaluate/blob/master/MANUAL.md для дальнейшего написания таких триггеров. У меня возникло небольшое непонимание по данному синтаксису (как правильно прочитать выражение, которое идет после знака вопроса ?), в моем случае я хотел создать триггер, которые сработает как ERROR, если у сервера №1 или сервера №2 потребляемая память будет больше некоторого порога (42G):

создал 2 таргета:

T1 - stats.berlin.memory.memory.used,
T2 - stats.moscow.memory.memory.used

 Триггер:

(t1 > 45097156608 || t2 > 45097156608) ? ERROR:OK

 Составил выражение больше по наитию, но спасибо, что в телеграм канале https://t.me/moira_alert  быстро подсказали как читать это выражение и как правильнее это загуглить - Тернарная_условная_операция в Си:

Если часть перед знаком вопроса истинна, то результатом вычисления всего выражения будет то, что перед двоеточием. Если ложна, то после двоеточия.

 Соответственно, можно таким же образом оперировать всеми 4-мя состояниями метрик у moira - OK, WARN, ERROR, NODATA.

Может случиться так, что в вашу систему мониторинга на основе graphite + clickhouse попало что-то лишнее/неправильно сформированная метрика или вдруг метрики от приложения/сервера вам стали больше не нужны.

На самом деле многое зависит от схемы именования метрик, если она хорошо спроектирована, то удаление может и не понадобиться. Например, у нас она не очень удачна - все базируется на имени хоста (по-хорошему надо отталкиваться от имени application, которое шлет метрики, например, stats.collectd.my-server1.load):

stats.my-server1
stats.my-server1.load
stats.my-server1.load.midterm
stats.my-server1.load.longterm
stats.my-server1.load.shortterm
stats.my-server1.memory
stats.my-server1.nginx
...
stats.my-server2
stats.my-server2.load
stats.my-server2.load.midterm
...
 

    Есть 2 подхода для съема метрик - pull (яркий представитель - prometheus) и push (яркий представитель - graphite).  Graphite - это мониторинг, состоящий из целой пачки различных микросервисов, некоторые уже почили в бозе, некоторые еще живы. Я по приходу в компанию, где сейчас работаю, застал такую расстановку сил: brubeck (для агрегации метрик), go-carbon ( занимается тем, что принимает метрики от всех и отдаёт их carbonapi), carbonapi (демон отдаёт метрики клиентам (в частности grafana)).

Предполагается, что читающий знаком с saltstack (https://www.saltstack.com/), писал для него стейты, подключал пиллары или еще чего-нибудь). В этой заметке попробуем реализовать свой state через cmd.run - он будет изменять данные только в случае необходимости плюс покажет нам, что он будет менять в режиме test=true.

Есть стандартная схема для работы нескольких сайтов

 

Начальные данные:

  • Site1 открывается приемлемое время, Site2 - долго (4-5 сек).
  • В браузере задержка  открытия проблемного сайта связана с высоким Waiting TTFB
  • Site1 и Site2  запущены  на одинаковых движках CMS (wordpress),
  • Site1 и Site2 уже имеют готовый контент
  • Трафик на оба сайта отсутствует

    Всем привет. Предположим, мы настроили связку https://github.com/ableev/Zabbix-in-Telegram . Получаем в telegram события с графиками по событиям триггеров, классно. Можно чуть развить идею и самим заставить ботa telegram отправлять нам графики из заббикса.

Схема пусть будет следующая:

 

 

 

После длительной нормальной работы ldap сервера вдруг начала появляться ошибка при старте:

Oct 18 10:47:22 server slapd[1416]: daemon: bind(10) failed errno=2 (No such file or directory)
Oct 18 10:47:22 server slapd[1416]: slapd stopped.

 

Выяснилось, что slapd не нравился путь до ldapi URL. Решения два: в файле /etc/default/slapd указать просто ldap URL или для ldapi указать путь до файла:

SLAPD_SERVICES="ldap:///"

или

SLAPD_SERVICES="ldap:/// ldapi://%2Fvar%2Frun%2Fopenldap%2Fldapi"

Если на компе с линуксом установлен обычный firefox без доп. плагинов (например в дефолтной установке ubuntu), настроен tor в режиме прозрачного прокси, то для доступа к onion доменам необходимо указывать в конце url точку, например:

https://3g2upl4pq6kufc4m.onion  - такое не пройдет (напишет, что сайт недоступен и необходимо проверить сетевое подключение)

https://3g2upl4pq6kufc4m.onion.  - с точкой в конце адреса сайт загрузится.

Если поставить другой браузер, то все работает как и ожидается.

Если прочитать статью https://habrahabr.ru/post/173045/ , то получается, что firefox, видимо,  воспринимает такой домен как относительный.

Сообщение в багзилле: https://bugzilla.mozilla.org/show_bug.cgi?id=1394756

В 9 (stretch) дебиане убрали пакет libmyodbc из репозитория. Теперь даже при установке пакета mysql-server  в качестве сервера БД поставится mariadb-server:

apt-get install mysql-server

ps uax | grep mysql
mysql     2893  1.1  7.2 653456 73824 ?        Ssl  10:01   0:00 /usr/sbin/mysqld

dpkg -S /usr/sbin/mysqld
mariadb-server-core-10.1: /usr/sbin/mysqld

 Значит необходимо настроить odbc для mariadb, благо ничего сложного.

    Цель: хотим автоматизировать генерирование виртуалок из шаблона в vcenter, используя какую-либо систему управления конфигурациями (ansible) или утилиту управления облачными ресурсами (terraform). Что получим в итоге - развернутую виртуалку и основное ради чего это затевалось - ее ip адрес. В документации по обоим продуктам все в принципе расписано, просто скомпоную в одном месте + некоторые свои пометки.

 

    Для расширения кругозора решил попробовать  jenkins  как  GUI для ансибла. ПО Jenkins - это все больше для девопсов и программистов, но почему его не попробовать офисному админу, периодически использующего ансибл?

    Например, если в диалплане есть что-то либо подобное:

same => n,System(echo "Voice message. текст из яндекс: ${TEXT1}" | mailx -a /record/${UNIQUEID}.wav -s "Voice message from (в скобках русские буквы)" $EMAIL)

 

      На почту приходит сообщение с Темой "Voice message from (?? ?????????????? ?????????????? ??????????)", а Тело сообщения как вложение с именем noname. Если пробовать запускать эту команду из консоли все работает, из скрипта тоже. Проблема возникает, если именно запускать из астериска.

В свое время (года 3-4 назад) появилась задача по переходу бездисковых рабочих станций freebsd (да, есть и такая экзотика) на ос дебиан (stable).

Что было в наличии: небольшие удаленные филиалы без админов, шлюз на freebsd в каждом филиале, рабочие станции с никсами.

Что хотим: удаленно засетапить нужную систему с минимальными усилиями.

Здесь бы хотел указать один из возможных вариантов удобного планирования диалплана в случае наличия филиалов с разной нумерацией.

Суть примерно следующая: каждый телефон в филиале размещается в своем контексте (например in_ekb, in_spb, in_msk и тп.). В каждом контексте указываются правила набора для исходящих звонков. Чтобы можно было совершать звонки между филиалами, каждый контекст содержит в себе один общий внутренний контекст, в котором указываем правила для внутренних звонков между филиалами. Примерная схема (внутренняя нумерация филиалов - например ekb 51XX, spb - 52XX):

 

Иногда приходится достать из вывода команды какую-либо подстроку, например uid:

VBoxManage list vms
"external" {ce0855a2-3d41-4526-a1f6-d6c63f6bface}
"web" {8326e080-d1df-4d6b-b074-010bb3bf553d}
"sip2" {696527a4-b87b-474c-a12b-83475d73d799}
"sip" {23bf91db-e871-42ae-876b-d68717b0fa6c}
"testVM" {69dcd4c7-3902-403a-af75-f9a8238dec6a}

 

Please publish modules in offcanvas position.