вторник, 19 ноября 2019 г.

mac upload: ERROR ITMS-90534: "Invalid Toolchain"

Xcode 11.2 is deprecated by Apple on November 5, 2019
Нужно обновлять xcode и смотреть что они сломали.

An error message it self says, Use stable (not beta) version of Xcode to create a build. Your mac OS should also be stable (not beta)

суббота, 2 ноября 2019 г.

Telegram и прокси

В ряде стран с диктаторскими режимами (включая рф, тут уже 20 лет диктатор у руля) пытатся блокировать телеграм. Из свежих мер борьбы - включение нового режима fake tls, который сложно отличить от обычного https.
А для ещё большего усложнения - подключаем sslh

Telegram наносит ответный удар DPI и блокировкам — Fake TLS
Telegram научился маскироваться под HTTPS

Поддерживающие режим Fake TLS Proxy:

  1. Python github.com/alexbers/mtprotoproxy
  2. Erlang github.com/seriyps/mtproto_proxy/tree/fake-tls
  3. С++ https://github.com/TelegramMessenger/MTProxy

mac: ставим homebrew

Это пакетный менеджер под мак, позволяющий ставить всякий полезный софт.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Далее например так
$ brew install wget

воскресенье, 27 октября 2019 г.

Unity3d: Failed to activate/update license. Timeout occured while trying to update license. Please try again later or contact

Есть такой кривой движок (точнее его лицензирование), со сборкой из консоли там беда. И как пример ошибка
Failed to activate/update license. Timeout occured while trying to update license. Please try again later or contact

Вариант первый - заходим на сервер сборки где-то раз в месяц, в Unity Hub, там активируем лицензию (вероятно, надо ещё сделать login в хабе)
Вариант второй: читаем, думаем.
https://unitycoder.com/blog/2017/05/19/install-run-unity-in-linux-terminal/
https://forum.unity.com/threads/5-4-0p1-fails-to-launch-due-to-license.425277/#post-2941499
https://forum.unity.com/threads/unity-5-3-seems-to-break-batchmode-nographics-on-headless-linux.376074/
https://stackoverflow.com/questions/47399488/building-running-headless-unity3d-game-in-ubuntu-docker-container

И вообще типа для консольной сборки нужна про версия (у нас есть, от гемора и танцев не спасает, при этом в 1 поток похоже можно таки собирать и на бесплатной лицензии)

пятница, 11 октября 2019 г.

Jenkins, freestyle job and git commit

Если требуется внести какие-либо изменения в гит ветку через jenkins, у нас есть плагин Git Plugin. Но он хорошо работает только если нам не нужны правки в репе, потому что суть плагина в том что он делает "detached HEAD", через получение id последнего коммита в ветке и git checkout (id), получая тем самым этот detached.
При этом мы можем сделать в сборке коммит (но не можем push - запросит данные для авторизации в гите), а дальше в послесборочных операциях добавляем Git Publisher, который вроде как пушит.. но всё пропадает бесследно. Также проблем добавляет то, что описания (те что в дженкинсе по нажатию вопроса) писал имбецил, из них непонятно ничего. Прежде всего речь про git publisher - branches.
Рекомендуется в Additional Behaviours добавить Clean before checkout
И до начала убеждаемся, что у нас есть права на push, иначе можно очень долго тупить когда будет говорить repository not found.

Что нужно проверить.
В управлении исходным кодом стоит refs/heads/our_branch
В Additional Behaviours добавлено
1) Clean before checkout
2) Custom user name/e-mail address и заполнено
3) Check out to specific local branch - commitbranch (имя можно поставить своё, это временная ветка, если первый пункт не ставить то в имя добавить $BRANCH_ID)
Таким образом, detached HEAD у нас превращается в локальную ветку, с которой гораздо проще работать.

Для успешного пуша необходимо в Branches - add branch добавить ветку,
Branch to push - имя ветки куда мы будем пушить, без префиксов, если пушить надо туда же откуда делали чекаут то нужно распарсить $GIT_BRANCH, взяв только последнюю секцию (без origin/ или refs/heads/), например так ${GIT_BRANCH/refs\/heads\//}
Target remote name - origin

Но есть и "другие варианты"
Итак, вариант первый: в build добавляем
git checkout $GIT_BRANCH и будет нормальный чекаут
https://stackoverflow.com/questions/19922435/how-to-push-changes-to-github-after-jenkins-build-completes/29786580
(но с пушем по прежнему есть нюансы, читаем по ссылке)

Вариант второй: сделать временную ветку и потом мержить её в нужную нам
Additional Behaviours - Check out to specific local branch
commitbranch-$BRANCH_ID
по сути, выше это и описано

Вариант третий:
Пушить не через git publisher а из шелла. Привет проблемы с тем как передать авторизацию, надо читать про git_askpass
https://stackoverflow.com/questions/42627269/jenkins-using-git-askpass-to-set-credentials/42636309
и в общем самый костыльный вариант

И ещё можно почитать
https://riptutorial.com/jenkins/example/27915/configuring-the-auto-push-job
https://stackoverflow.com/questions/14766214/jenkins-git-publisher-how-to-push-back-to-git-branch
https://www.theserverside.com/video/Tips-and-tricks-on-how-to-use-Jenkins-Git-Plugin

среда, 18 сентября 2019 г.

Amazon+Docker

В AWS есть аж 3 сервиса для поднятия докера:
1) ECR+ECS
2) EKS

1) ECR+ECS
ECR это аналог Docker Registry, ничего особо сложного
ECS - более интересен, это и есть по сути докер. И тут есть нюанс: запускать докеры можно в 2 режимах, на базе созданных виртуалок и на базе serverless технологии FarGate. То есть сервера там разумеется тоже есть, но ими занимается сам амазон.

2) EKS - это примерно kubernetes, для тех кому мало просто пускать машины, но хочется автоматизации обработки сбоев, обновлений и откатов.

Что почитать

nagios: получение метрик

#переработать

Для локальной машины метрики можно получить так
define service{
        use                             generic-service         ; Name of service template to use
        host_name                       Linux_Host
        service_description             / Partition
                check_command                                   check_local_disk!50%!25%!/
        }
(предварительно описываем Linux_Host через define host, вообще любые хосты которые упоминаются в host_name должны быть заранее описаны)

Также можно в objects/templates.cfg вписать такое
define service {
    name                    sip-pinger-service
    use                     generic-service
    service_description     Pinger
    check_command           check-sip-options
    contact_groups          admins
    register                0
}
И потом вызвать в хосте так
define service {
    use                     sip-pinger-service
    host_name               1.1.1.1
}
В случае, если по ряду причин host_name не хочется описывать, будет так
define service {
    use                     sip-pinger-service
    host_name               Liux_Host
    check_command     check-sip-options!1.1.1.1
}
где ! это разделитель аргументов, результаты будут в ARG переменных

Когда нужно получить показания с других хостов, обычно это делается через nrpe, например так
define service{
        use                             local-service         ; Name of service template to use
        host_name                       Linux_Host2
        service_description             / Partition
        check_command                check_nrpe!check_root_partition
        }

А на Linux_Host2 в /etc/nrpe.d/ пишем файл (.cfg) со строкой вида
command[check_root_partition]=/usr/lib64/nagios/plugins/check_disk -w 50% -c 25% -p /

Если выдаст ошибку - смотреть objects/command.cfg, там должно быть такое
################################################################################
#
# NRPE check commands
#
################################################################################
define command{
    command_name    check_nrpe
    command_line    $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}

Установка nagios

Сначала оговорка. Это достаточно посредственный недо-мониторинг, который сам не умеет в историю значений и в графики, и вообще неудачный убогий формат конфигов, как минимум лучше перейти на icinga2.
Вообще, можно посмотреть на достаточно интересную доку
https://labs.consol.de/omd/

Но если уж "так исторически сложилось" то вот

Centos 6:
https://www.digitalocean.com/community/tutorials/how-to-install-nagios-on-centos-6
под 7 будет примерно так же

Проверить что есть в commands.cfg
###############################################################################
# NRPE CHECK COMMAND
#
# Command to use NRPE to check remote host systems
###############################################################################

define command{
command_name check_nrpe
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}


воскресенье, 15 сентября 2019 г.

Полезные модули Jenkins: разрабатываем под Unity3d

https://wiki.jenkins.io/display/JENKINS/Unity3dBuilder+Plugin
По запуску читаем доку.

Также для публикации в google store есть
https://wiki.jenkins.io/display/JENKINS/Google+Play+Android+Publisher+Plugin
Увы, маководы должны страдать и под них плагинов нет. Причём даже fastlane не поможет - это враппер на itms, который нормально работает только под маком.
Хотя есть такое
https://wiki.jenkins.io/display/JENKINS/Xcode+Plugin

Полезные модули Jenkins: Copy Artifact

Когда задачи достаточно сложные, часто они выстраиваются в цепочки. И бывает так, что собриаем артефакт на одном воркере, а потом обрабатываем на другом. Тогда пригодится модуль Copy Artifact.
https://wiki.jenkins.io/display/JENKINS/Copy+Artifact+Plugin
Но с ним есть нюанс: если есть 2 задачи, ставить задачу с copy зависимой может вызвать труднопонимаемые проблемы, в частности режимы что копировать. По сути, в там случае рабочий режим только один - "Upstream build that triggered this job". В случае Latest successful будет вливаться артефакт предыдущего успешного запуска, поскольку к моменту copy он ещё не successful.

Что ещё можно глянуть
https://codurance.com/training/2014/10/03/guide-to-deploying-artifacts-with-jenkins/
https://subscription.packtpub.com/book/networking_and_servers/9781788297943/6/ch06lvl1sec65/copying-an-artifact-from-another-build-job
https://jenkinsci.github.io/job-dsl-plugin/#plugin/copyartifact
http://qaru.site/questions/502425/how-can-i-use-the-jenkins-copy-artifacts-plugin-from-within-the-pipelines-jenkinsfile

Полезные модули Jenkins: Базовые модули

Чтобы передать параметры в сборку
https://wiki.jenkins.io/display/JENKINS/Parameterized+Trigger+Plugin
Передача паролей в сборку
https://wiki.jenkins.io/display/JENKINS/Credentials+Binding+Plugin

Полезные плагины для работы с гитом и гитхабом
https://wiki.jenkins.io/display/JENKINS/Github+Plugin
https://wiki.jenkins.io/display/JENKINS/Git+Plugin
https://wiki.jenkins.io/display/JENKINS/GitHub+Integration+Plugin

Если что-то собираем
https://wiki.jenkins.io/display/JENKINS/Build-timeout+Plugin

четверг, 29 августа 2019 г.

MasOS in amazon cloud?

Note: first and foremost, it’s completely illegal. The macOS/OS X end user license agreement specifies that you have a right to use the OS on hardware made by Apple, no place else.

Так что если амазон не закупит большую пачку серверов в свои ДЦ - легально это не сделать. Хотя если есть куча времени, можно попробовать развернуть hackintosh.

Был уже такой вопрос
https://forums.aws.amazon.com/message.jspa?messageID=568932
2014 год, воз и ныне там.
Но можно посмотреть на сервисы, которые такое уже сделали
https://www.macincloud.com/
https://www.hostmyapple.com/
https://www.macstadium.com/usecases#Build-Machines

среда, 28 августа 2019 г.

nginx json logs

log_format json_combined escape=json '{ "created_at": "$msec", '
            '"remote_addr": "$remote_addr", '
            '"remote_user": "$remote_user", '
            '"request": "$request", '
            '"status": $status, '
            '"bytes_sent": $bytes_sent, '
            '"request_length": $request_length, '
            '"request_time": $request_time, '
            '"http_referrer": "$http_referer", '
            '"http_x_forwarded_for": "$http_x_forwarded_for", '
            '"http_user_agent": "$http_user_agent" }';
access_log  /var/log/nginx/access.log  json_combined;

среда, 14 августа 2019 г.

Private subnet + openvpn в амазоне

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

2 доки, с которыми стоит заранее ознакомиться
https://aws.amazon.com/ru/blogs/awsmarketplace/setting-up-openvpn-access-server-in-amazon-vpc/
https://www.freecodecamp.org/news/how-you-can-use-openvpn-to-safely-access-private-aws-resources-f904cd24f890/

Вкратце, можно взять уже готовый образ с openvpn AS (access server) и платить потом за его использование, а можно развернуть ось и поставить туда пакет с openvpn as. При втором подходе будет ограничение на 2 одновременных коннекта.

Сама установка (для centos):
wget http://swupdate.openvpn.org/as/openvpn-as-2.5.2-CentOS7.x86_64.rpm
yum install -y openvpn-as-2.5.2-CentOS7.x86_64.rpm

Увы, там нет про создание private subnet, может быть позднее сделаю.

четверг, 25 июля 2019 г.

Jenkins + Google Play: быстрый старт (очень быстрый)

1) https://wiki.jenkins.io/display/JENKINS/Google+Play+Android+Publisher+Plugin
2) https://www.youtube.com/watch?v=txdPSJF94RM&list=PLhF0STyfNdUk1R3taEmgFR30yzp41yuRK&index=1 и второе видео

Обращаем внимание на grants, иначе при попытке выкатки будет FORBIDDEN без объяснений - это забыли выдать права (grant permissions) по ключу

Если ошибка - APK specifies a version code that has already been used.
то надо смотреть свойства приложения в коде, плагин оттуда выдёргивает CodeVersion. Также можно глянуть https://developer.android.com/google/play/expansion-files.html

Как альтернатива - есть fastlane
Fastlane  -  это инструмент для автоматизации процессов сборки и выкладки мобильных iOS и Android приложений, которая включает в себя также генерирование скриншотов, запуск Unit/UI тестов, отправка сообщений в Slack, подключение к Crashlytics и многие другие полезные вещи, которые упрощают жизнь.
Напримр

Если будет желание ставить fastlane, в центоси руби версии 2.0, а там по зависимостям нужен 2.1+, дока по установке руби 2.1
https://tecadmin.net/install-ruby-latest-stable-centos/
Переключаем руби в 2.1, и далее gem install fastlane -NV

вторник, 23 июля 2019 г.

CentOS 7: ставим MongoDB произвольной версии

Для начала, надо определить какая версия нам нужна, список можно взять тут
http://repo.mongodb.org/yum/redhat/7/mongodb-org/
На данный момент там доступны версии от 3.0 до 4.1

понедельник, 17 июня 2019 г.

Освоение zoom rooms

По сути, это просто устройство для подключения к стандартной zoom конференции (ТВ, комп, проектор - есть варианты).
https://www.owllabs.com/hubfs/Assets%202018%20S2/Zoom_Room_Setup_Guide.pdf
https://support.zoom.us/hc/en-us/categories/200108436-Zoom-Rooms

https://support.zoom.us/hc/en-us/articles/360021967252-Starting-or-Joining-a-Meeting-from-a-Zoom-Room
https://support.zoom.us/hc/en-us/sections/200305533-Setup-Configuration

Чуть про docker compose

Что делать, если надо запускать несколько связанных докер-машин? Есть фирменная "технология" swarm, но де-факто оно не взлетело.
Итак, есть вариант сложный - это kubernetes, его пока оставим за рамками. И вариант простой - docker compose. Отличий много, но если надо для теста запустить несколько связанных машин, которые знают друг о друге и в том числе можно централизованно управлять переменными для всех машин - это легко на композере решить.
Что можно почитать про docker compose? Например, это

Полная автоматизация «development» среды с помощью docker-compose / Хабр
Краш-курс на Docker: научитесь плавать с большой рыбой / Блог компании Southbridge / Хабр
Полное практическое руководство по Docker: с нуля до кластера на AWS / Хабр
Определение многоконтейнерного приложения с помощью docker-compose.yml | Microsoft Docs
Большой Docker FAQ: отвечаем на самые важные вопросы - «Хакер»

суббота, 15 июня 2019 г.

Rundeck

Есть такая пускалка для задач, rundeck. Апи, веб неплохой. При этом - оно сделано на java, что требует нужного софта для запуска, и что оно жрёт память и периодически падает.
Но рассмотреть как аналог jenkins иногда имеет смысл.

https://xakep.ru/2014/10/05/rundeck-managing/
https://ctrlok.com/post/why-i-dont-like-rundeck/

четверг, 16 мая 2019 г.

Understanding STIR/SHAKEN

https://transnexus.com/whitepapers/understanding-stir-shaken/

The Federal Communications Commission (FCC) has been encouraging the telecommunications industry to develop a solution to stop robocalls and spoofed calling numbers since 2014. The industry’s response has been to develop a new technology standard called STIR [1] (Secure Telephony Identity Revisited) and SHAKEN [2] (Secure Handling of Asserted information using toKENs) which defines how telephone service providers should implement the STIR technology to ensure calling numbers are not spoofed.

среда, 15 мая 2019 г.

Ставим sip3 trial

Что это - можно посмотреть тут
https://sip3.io/features/

По установке, есть репа с буками для ansible, которые выкатывают пакеты в докер.
https://github.com/sip3io/sip3-ansible/
Делаем clone.
Для установки нужны ansible (в центос 7 из epel) и docker (ставить с сайта), а также
yum install python-pip
pip install docker-py

Вносим нужные хосты
vi roles/sip3-salto/templates/hosts.yml.j2

Также, если порт 80 занят, правим порт для запуска
vi roles/sip3-hoof/tasks/main.yml
80 на 88

И запускаем установку.
ansible-playbook -K playbooks/trial/sip3.yml
ansible-playbook -K playbooks/trial/captain.yml

Также учитываем момент что всё будет доступно без SSL и паролей, так что это только для закрытого контура или прогонять через nginx для ssl и авторизации.

вторник, 14 мая 2019 г.

Termshark - A terminal user-interface for tshark, inspired by Wireshark.

Доступен первый выпуск Termshark, консольного интерфейса, выполненного в форме надстройки над развиваемым проектом Wireshark анализатором сетевых протоколов TShark. Код написан на языке Go и распространяется под лицензией MIT. Готовые сборки подготовлены для Linux, macOS, FreeBSD и Windows.

Интерфейс Termshark по стилю напоминает штатный графический интерфейс Wireshark и предоставляет привычные для пользователей Wireshark функции инспектирования пакетов, при этом позволяя наглядно анализировать трафик на удалённой системе без необходимости передачи pcap-файлов на рабочую станцию. Поддерживается как обработка готовых pcap-файлов, так и перехват данных в режиме реального времени с работающих сетевых интерфейсов. Возможно применение экранных фильтров, подготовленных для Wireshark, и копирование диапазонов пакетов через буфер обмена.

https://termshark.io/
https://github.com/gcla/termshark
https://www.opennet.ru/opennews/art.shtml?num=50556
https://github.com/gcla/termshark/releases/tag/v1.0.0

Поскольку оно на golang, можно взять уже собранный файл и просто положить например в /usr/bin (внимание, для работы требуется поставить tshark)
wget https://github.com/gcla/termshark/releases/download/v1.0.0/termshark_1.0.0_linux_x64.tar.gz
tar -zxvf termshark*
mv termshark*/termshark /usr/local/bin

При ошибке
Could not find tshark in your PATH. The tshark binary is required to run termshark.
Try installing with: yum install wireshark
требуется поставить wireshark.

termshark will not operate correctly with a tshark older than 1.10.2 (found 1.8.10)
Если ставим в центос6 - версия из того что было в epel слишком стара. Проблема в том, что даже в DAG только 1.10.0-2

понедельник, 6 мая 2019 г.

Небольшое исследование про golang-github-influxdb-influxdb-datastore

Если кто сталкивался с докой
https://support.nagios.com/kb/article.php?id=802
то видел, что не найти пакет golang-github-influxdb-influxdb-datastore, исследование тэгов репы показывает что оно было в ветке 0.8, но было выпилено к выходу ветки 0.9.
Можно скачать rpm с этим пакетом (например с rpm.pbone), но он не поставится по зависимостям.
(И вкратце - ставить datastore уже не нужно)

воскресенье, 5 мая 2019 г.

CentOS 6: ставим AlertManager

https://prometheus.io/download/
тут качаем AlertManager, распаковываем, копируем alertmanager и amtool в /usr/local/bin/, конфиг в /etc/prometheus/alertmanager.yml
Потом тут
https://gist.github.com/JoergM/86617e89d6491b42596c
инит файл под него.
Настройку опускаем, это можно делать через правку конфига или напрямую через amtool
Копируем init файл в /etc/init.d, выставляем +x на него, добавляем пользователя prometheus
groupadd prometheus
useradd -d /var/lib/prometheus -g prometheus -M -s /sbin/nologin prometheus

Запускаем.
mkdir /var/log/prometheus/
chown prometheus /var/log/prometheus/
mkdir /var/lib/prometheus/alertmanager
chown prometheus: /var/lib/prometheus/alertmanager

Вносим правки в инит файл: нужно к -config добавить минус чтобы получилось --, удалить часть про silences, и добавить --storage.path=/var/lib/prometheus/alertmanager
Конфиг - расширение меняем на .yml
/etc/init.d/alertmanager start

По настройке есть например тут
https://prometheus.io/docs/alerting/configuration/

Чуть подробнее про особенности 2.0+ версии есть тут
https://ealebed.github.io/posts/2017/prometheus-%D0%BC%D0%B8%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D0%BD%D0%B0-%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8E-2.0/

среда, 1 мая 2019 г.

Nagios+grafana

За основу можно взять статью
https://support.nagios.com/kb/article.php?id=802
Но - только взять за основу, поскольку эта статья УЖАСНА. По форме и содержанию. Главный элемент в этой доке это nagflux, который связывает метрики нагиоса и БД influxdb. Также описывается histou

Есть ряд нюансов, например если ставим в центос6 то epel там постоянно обрезают, нужно искать пакеты по архивам.
Вообще, дока крайне странная, чего стоит использование путей /usr/local/..., вместо cat >> file << EOF делается пачка echo '', неполные и нерабочие конфиги...
Также можно посмотреть эту доку
https://exchange.nagios.org/directory/Documentation/Nagios-with-InfluxDB%2C-nagflux-and-Grafana/details

пятница, 26 апреля 2019 г.

Unable to negotiate with x.x.x.x.123 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1

При подключении к некоторым железкам типа Cisco ASA5508 может быть ошибка при подключении
Unable to negotiate with x.x.x.x.123 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1

Фикс: указать опцию -oKexAlgorithms=+diffie-hellman-group1-sha1
например так
ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 x.x.x.x

Можно в ~/.ssh/config добавить
Host x.x.x.x
    KexAlgorithms +diffie-hellman-group1-sha1

воскресенье, 14 апреля 2019 г.

Debian: ставим kamailio+rtpengine

Имеется: debian 8 (jessie), кама штатно - говно мамонта
Unpacking kamailio (4.2.0-2+deb8u5) ...
Ставим адекватную версию. Прямо с офсайта можно скачать с версии 3.3 по самую свежую 5.2
https://deb.kamailio.org (2)
Сначала добавить ключ
 wget -O- http://deb.kamailio.org/kamailiodebkey.gpg | sudo apt-key add -
а потом ставим репу, для этого выбираем нужную версию камы и в /etc/apt/sources.list.d/kamailio.list пишем нужные строки из доки выше.
Потом как обычно, apt-get update; apt-get install kamailio

вторник, 9 апреля 2019 г.

nginx ldap auth

Самый простой вариант ограничения доступа - через файл с паролями, как-то так
location / {
auth_basic "Restricted Area";
auth_basic_user_file auth/htpasswd;
proxy_pass ... }

Но порой требуется интеграция с ldap. Есть несколько вариантов
  1. https://github.com/nginxinc/nginx-ldap-auth - отдельный сервис, можно запустить в докере, обращение к сервису идёт по http
  2. Внешние модули:
    https://github.com/kvspb/nginx-auth-ldap
    https://github.com/sto/ngx_http_auth_pam_module
  3. Штатный модуль http://nginx.org/en/docs/http/ngx_http_auth_request_module.html, но общение с ldap надо реализовать самому
Плюсы и минусы каждого подхода вполне понятны. Модуль - надо собирать под ту же версию, а если оно не умеет динамическим модулем то потом собирать пакет и выкатывать нашу сборку. Нужно отслеживать процесс обновления пакетов, чтобы не поставилась другая версия (решается через опцию Requires в spec файле).

Соберём пакет по п.1, при этом обязательно актвировать модуль ngx_http_auth_request_module (включено в официальных сборках), спека в комплекте
https://github.com/nginxinc/nginx-ldap-auth/tree/master/rpm

пятница, 29 марта 2019 г.

Делаем свой docker registry

https://docs.docker.com/registry/deploying/

Само создание сводится к одной команде (требуется установленный докер)
docker run -d -p 5000:5000 --restart=always --name registry registry:2

Потом вешаем нужный тэг
docker tag ubuntu:16.04 localhost:5000/my-ubuntu
и push
docker push localhost:5000/my-ubuntu

Но с других машин при пуше будет ошибка http: server gave HTTP response to HTTPS client, нужно настраивать сертификат или создавать /etc/docker/daemon.json (см доку).

CentOS, rtpengine dkms сборка модуля

https://habr.com/ru/post/266399/

Главное требование - наличие установленных пакетов ядра:
yum install -y kernel kernel-headers kernel-devel kernel-tools kernel-debug-devel
И перезагружаемся, чтобы переключиться на эту версию. После этого, поставив ngcp-rtpengine-kernel, модуль должен загрузиться сам. Если нет - смотрим линк выше, в сторону dkms add, dkms build, dkms install

Prometheus

Prometheus - "мониторинг нового поколения".
Prometheus' main distinguishing features as compared to other monitoring systems are:

a multi-dimensional data model (timeseries defined by metric name and set of key/value dimensions)
a flexible query language to leverage this dimensionality
no dependency on distributed storage; single server nodes are autonomous
timeseries collection happens via a pull model over HTTP
pushing timeseries is supported via an intermediary gateway
targets are discovered via service discovery or static configuration
multiple modes of graphing and dashboarding support
support for hierarchical and horizontal federation

Prometheus после nagios или zabbix может сначала очень сильно запутать, как ставить, как запускать... Если с тем же заббиксом - поставили, прошли по быстрой настройке, и вот у нас есть база, есть веб, есть ядро системы, ставим агенты где надо и пишем правила что мониторить, то тут может поначалу пухнуть голова.
Ставить можно прямо на хост, можно в докере, но после базовой установки получаем систему которая сама ничего не умеет опрашивать, не умеет оповещать, да и графики там так себе. И тут начинается.
  • Где хранить?
  • Как получать?
  • Как выводить?
  • Как оповещать?
  • Как масштабировать?

Помимо самого прометея, есть ещё
push gateway для работы с кратковременными процессами (когда сервис работает слишком мало времени, что бы Prometheus имел возможность выполнять к нему запросы для получения метрик)
exporters для сбора метрик из сторонних сервисом (и таких экспортёров – миллион, и имя им легион). В частности, большой список есть тут https://prometheus.io/docs/instrumenting/exporters/
alertmanager – менеджер уведомлений (умеет Slack, почту и т.д.)

А также..
  1. дашборды (dashboards), где будем настраивать всякие красивые графики;
  2. Системы сбора, обработки метрик;
  3. Базы, где метрики будут храниться;
1. Grafana
2. StatsD, telegraf, carbon
3. graphite, influxdb, whisper, prometheus...

четверг, 28 марта 2019 г.

Мониторим nginx статистику (коды ответов итд) через prometheus, подключаем dashboard в grafana

Базовый (не Plus) nginx выдаёт крайне скупую статистику - сколько коннектов сейчас, сколько обработано. Чтобы получать больше информации, нужно или парсить access логи, или ставить модуль vts - их есть 2 вида
1) https://github.com/vozlt/nginx-module-vts
собирается динамическим модулем для nginx, причём версии nginx и модуля должны совпадать

2) https://github.com/knyar/nginx-lua-prometheus
требует lua, то есть или нужен nginx plus или openresty

Поставим первый модуль и подключим к нему экспортер vts в json
https://github.com/hnlq715/nginx-vts-exporter
UP: больше не нужно, nginx-vts научился экспортировать prometheus и json сам. Просто пишем server например на порт 9913 "как было" и всё. И там сразу
    location /metrics {
        vhost_traffic_status_display;
        vhost_traffic_status_display_format prometheus;
        vhost_traffic_status_bypass_stats on;
    }

Сборку и установку динамического модуля опустим (подробнее есть тут), только проверим что по адресу http://localhost/status есть отдача статистики модуля (а чтобы она появилась, читаем тут).
Теперь подключаем экспортер, и по адресу http://localhost:9913/metrics смотрим что появилась информация.
А теперь само подключение дашборда.
http://docs.grafana.org/reference/export_import/#importing-a-dashboard
Читаем как подключать, там достаточно просто id вставить и заполнить data source (prometheus), брать например тут
Nginx VTS Stats

Теперь переходим на http://(server):3000/dashboard/import и в Grafana.com Dashboard вставляем нужный нам id.

PS
Обращаю внимание, есть такой шлак
https://github.com/nginxinc/nginx-prometheus-exporter
Почему шлак? Потому что для чистого nginx он просто экспортирует stub_status, тот самый мизер.

среда, 27 марта 2019 г.

ещё немного про сборку пакетов под debian

https://habr.com/ru/company/itsumma/blog/443490/#comment_19876102

А у вас была необходимость собирать пакеты «правильно и канонично»? (Под этим я имею ввиду когда пишется debian/rules а потом все собирается при помощи dpkg-buildpackage -us -uc)

Просто, если делать это для внутренних нужд, то шаблон control.in, куда подставляются нужны значения версий, posints/postrm скрипты если нужны, директория с деревом файлом + fakeroot dpkg-deb --build и готовый пакет. Вроде совсем небольно. Можно еще fpm использовать, но если нет необходимости собирать пакеты под другие дистрибутивы, то какого-то особого преимущества он имхо не даст.

А если совсем «для себя», то можно checkinstall использовать.

https://michael.stapelberg.ch/posts/2016-11-25-build-tools/
Ну и сама статья о том, что с пакетами в debian всё довольно печально даже для maintainer

JSON Web Tokens (JWT)

JSON Web Token (JWT) — это открытый стандарт (RFC 7519) для создания токенов доступа, основанный на формате JSON. Как правило, используется для передачи данных для аутентификации в клиент-серверных приложениях. Токены создаются сервером, подписываются секретным ключом и передаются клиенту, который в дальнейшем использует данный токен для подтверждения своей личности.

Может использоваться для stateless http, верификации и валидации,в sip может применяться как подтверждение что звонящий не подделал заголовки...

Что почитать по теме:
https://ru.wikipedia.org/wiki/JSON_Web_Token
Пять простых шагов для понимания JSON Web Tokens (JWT)
JWT простым языком: что такое JSON токены и зачем они нужны

понедельник, 25 марта 2019 г.

debian wheezy: Cannot fetch index base URL http://pypi.python.org/simple/

https://stackoverflow.com/questions/21294997/pip-connection-failure-cannot-fetch-index-base-url-http-pypi-python-org-simpl

Когда пытаемся сделать yum install python-pip; pip install --updrade pip то получаем
Cannot fetch index base URL http://pypi.python.org/simple/

Фикс:  pip install --index-url=https://pypi.python.org/simple/ --upgrade pip
(внимание на https://)

вторник, 26 февраля 2019 г.

CentOS: чем собирать пакеты

1) классика, rpmbuild
1.5) собираем srpm и потом дособираем пакеты через mock
2) fpm. Осторожно, ruby! Умеет собирать не только под центос, но руби убивает его на корню.
3) tito
4) rpkg

Чем плох rpmbuild - он не умеет выкачивать сам пакеты (есть spectool, но он качает только готовые файлы), интеграции с гитом не умеет. Умеет в частности tito, или можно взять за пример такое.

четверг, 14 февраля 2019 г.

How to Fix error for MySQL 5.7 with Ubuntu 18.04 {ERROR 1698 (28000): Access denied for user ‘root’@’localhost’}

https://www.expresstechsoftwares.com/mysql-access-denied-user-root-localhost/

Суть в том что в 5.7.25 ВДРУГ перестал работать логин рутом по сети и даже от другого юзера (не рута сервера), в частности ломается коннект через phpmyadmin после минорного обновления mysql.
Коннектимся от рута, без параметров
# mysql
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;


Или можно так
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'very_strong_password';FLUSH PRIVILEGES;

Непонятно чей это косяк, но нервов он может попортить.

вторник, 12 февраля 2019 г.

Ходим по ssh через tor

https://trac.torproject.org/projects/tor/wiki/doc/TorifyHOWTO/ssh

Последний рецепт через .ssh/config не работает, еще 2 проверены и работают
sudo apt-get update
sudo apt-get install tor torproxy
sudo service tor start

1) torproxy ssh aaa@bb
2) ssh -o "ProxyCommand nc -X 5 -x 127.0.0.1:9050 %h %p" aaa@bb

пятница, 8 февраля 2019 г.

Расширенная статистика nginx

Есть такой пакет, nginx-module-vts, даёт много полезной информации. Есть ссылка на офсайте в разделе NGINX 3rd Party Modules.
Но последний коммит был 30 июня 2018 и с тех пор автор не отвечает.

Есть другой модуль, nginx-lua-prometheus. Под debian есть инструкция через установку libnginx-mod-http-lua, но centos тут в пролёте, так что собираем первый.

понедельник, 4 февраля 2019 г.

Ускоряем ansible

Проблемы могут быть в разных местах.
Можно ускорить стадию gathering facts, включив кэширование фактов
[defaults]
fact_caching=redis
https://docs.ansible.com/ansible/latest/plugins/cache.html

Когда к хосту подключение долгое, поможет pipelining
[ssh_connection]
pipelining = True
https://docs.ansible.com/ansible/latest/reference_appendices/config.html?highlight=pipelining#ansible-pipelining

Также при этом можно посмотреть на ControlPersist
https://docs.ansible.com/ansible/latest/reference_appendices/config.html?highlight=controlpersist#ansible-ssh-args

Accelerated Mode Deprecated

Pull режим
http://docs.ansible.com/playbooks_intro.html#ansible-pull

Также было найдено такое, но у меня не заработало.
https://docs.ansible.com/ansible/latest/plugins/connection/persistent.html

Небольшая памятка по сборке deb пакетов

Для простых пакетов есть checkinstall

Сборка пакетов. Глава 2. DEB. Часть 1. Общие понятия.
Сборка пакетов. Глава 2. DEB. Часть 2. Сборка пакетов
Но статьи 2007 года.

https://www.debian.org/doc/manuals/maint-guide/build.ru.html
https://habr.com/ru/post/78094/

воскресенье, 3 февраля 2019 г.

ansible: настраиваем интерфейс в centos7

К сожалению, почти все инструкции описывают работу через достаточно корявый и ненавистный многими networkmanager, а вот для более классической настройки ничего вменяемого не гуглится.
Вообще, есть модуль interfaces_file, но простейший тест показывает что он не работает (вероятно, debian only).

четверг, 31 января 2019 г.

Учим node.js делать reload

Штатно node.js вообще не умеет работать более чем в 1 поток, это лечится добавлением модуля cluster. Но штатно там нет reload, только restart всего.
Есть модуль pm2, который умеет гораздо больше. В частности, reload:
https://pm2.io/doc/en/runtime/guide/load-balancing/

вторник, 29 января 2019 г.

Ansible: прогнать удаленный файл через шаблонизатор

Если есть некий шаблон, который например поставили из пакета, и нужно заменить в нём переменные, есть 3 варианта
1) самый корявый, через lineinfile, blockinfile или replace
2) Более правильный, через syncronize или fetch выкачиваем локально и прогоняем через template
3) прогоняем in-place через шаблонизатор jinja2, который ставится отдельно на сам хост, и envsubst
https://unix.stackexchange.com/questions/294378/replacing-only-specific-variables-with-envsubst

По 2 будет выглядеть примерно так
- name: Setup kamailio dispatcher, fetch config to ansible host
  fetch:
    src: /etc/kamailio/dispatcher.list.template
    dest: /tmp/{{ ansible_hostname }}.dispatcher.list
    flat: yes

- name: fill it
  template:
    src: /tmp/{{ ansible_hostname }}.dispatcher.list
    dest: /etc/kamailio/dispatcher.list

- name: clean after fetch
  file:
    path: /tmp/{{ ansible_hostname }}.dispatcher.list
    state: absent

(хотя тут еще правильнее завернуть в block и переместить очистку в секцию always:)

Ansible: EPEL in CentOS 7

Если нужно поставить epel в центос 7 то это делается разными путями, например так
https://github.com/geerlingguy/ansible-role-repo-epel/blob/master/tasks/main.yml
(или просто подключаем эту роль, или так, вариантов много...)
можно зайти сюда и взять отсюда ключ например
https://dl.fedoraproject.org/pub/epel/

Но можно гораздо проще.
- name: Install EPEL repo
  yum:
    name: epel-release
    state: latest

Потому что всё нужное в 7 центоси уже есть и так. Бонусом - ставятся еще epel-testing и epel-src

воскресенье, 27 января 2019 г.

Moby/Docker в продакшене. История провала

2 статьи, почему с докером нужно быть осторожнее. И почему недопустимо пихать базы в докер.
https://habr.com/ru/post/332450/
https://habr.com/ru/post/346430/

Конечно, он не стоит на месте, но общий подход к разработке резко измениться не может (в лучшую сторону как минимум).
Также советую посмотреть на containerd, на него стал переходить тот же Kubernetes

четверг, 24 января 2019 г.

github deploy keys

Работали долгое время с битбакетом, но на другом проекте используют github.
https://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys
Делаем по инструкции, добавляем ключ для деплоя на одну репу, работает. Добавляем на другую - получаем ошибку
Error: Key already in use
Эти идиоты не осилили 1 деплой ключ на несколько реп! При том что битбакет так умеет, а гитлаб вообще штатно предлагает список уже подключенных ключей, для ещё бОльшего удобства. И это при том что если завести "фейкового" юзера, которому навесить тот же ключ и через запрос invitation выдать доступы то всё работает. Так что это именно рукожопость и ничего более.
Разные варианты гуглятся по "github Error: Key already in use"

5 решений:
1) заводим отдельную почту, письма с которой можно перенаправить админам, регистрируем её в гитхабе, на нужные репы отправляем приглашения, в свойствах добавляем нужный нам ключ. Потом принимаем приглашения, работаем.
2) через ssh-keygen (можно в интерактивном режиме) создаём столько ключей, сколько у нас реп, заводим где-то табличку с публичными ключами и от чего они. Теперь можно заполнить ~/.ssh/config, вписав несколько Host секций с разными IdentityFile, и делать git clone по этим именам,
3) или выставляя переменную - в 2.10+ есть GIT_SSH_COMMAND куда передаем строку вида 'ssh -i ~/.ssh/key1', в более ранних нужно возиться через врапперы и выставлять переменную так: GIT_SSH='~/git_wrapper.sh', в котором будет
ssh -i '~/.ssh/key1' $1 $2
4) ssh_agent
5) сменить площадку на битбакет или гитлаб, где нет этого маразма.

Более развернуто например тут
https://superuser.com/questions/232373/how-to-tell-git-which-private-key-to-use

пятница, 18 января 2019 г.

letsencrypt wildcard

Letsecrypt c 13 марта 2018 года уже умеет wildcard сертификаты, но пока только с верификацией через dns (до сих пор)
https://medium.com/@saurabh6790/generate-wildcard-ssl-certificate-using-lets-encrypt-certbot-273e432794d7

https://blogs.msdn.microsoft.com/mihansen/2018/03/15/creating-wildcard-ssl-certificates-with-lets-encrypt/
https://kostikov.co/pereezzhaem-na-wildcard-sertifikaty-lets-encrypt

UPD
Пример использования с яндексом
https://github.com/actionm/certbot-dns-pddyandex
НО: яндекс можно сказать не работает
https://goodprogrammist.ru/posts/dns-yandex-bag/
Чтобы наверняка сработало, надо ставить ожидание записи несколько часов, можно сутки. Час - работает примерно никогда.

и памятка, строка для генерации по доке выглядит так


./letsencrypt-auto certonly --manual-public-ip-logging-ok --agree-tos --email info@site.com --renew-by-default -d site.com -d *.site.com --manual --manual-auth-hook ../certbot-dns-pddyandex/authenticator.sh --manual-cleanup-hook ../certbot-dns-pddyandex/cleanup.sh --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory

среда, 9 января 2019 г.

Understanding jinja in salt

https://pastebin.com/ceLS8Lr3

(links only)
#UNDERSTANDING JINJA
https://docs.saltstack.com/en/latest/topics/jinja/index.html#jinja-in-states

#Cool document about how to write TRUE salt states on jinja:
https://docs.saltstack.com/en/latest/ref/renderers/all/salt.renderers.jinja.html#

#Jinja loading utils to enable a more powerful backend for jinja templates
https://docs.saltstack.com/en/latest/ref/renderers/all/salt.renderers.jinja.html#module-salt.renderers.jinja

#SLS TEMPLATE VARIABLES REFERENCE (salt, grains, pillars, и т.д.)
https://docs.saltstack.com/en/latest/ref/states/vars.html#sls-template-variable-reference

#Official doc
http://jinja.pocoo.org/docs
http://jinja.pocoo.org/docs/2.10/templates/#builtin-filters

https://docs.saltstack.com/en/latest/topics/jinja/index.html#debugging
Context is: {{ show_full_context()|yaml(False) }}


https://docs.saltstack.com/en/latest/topics/jinja/index.html#logs
{%- do salt.log.error('testing jinja logging') -%}

вторник, 8 января 2019 г.

Пара трюков salt

1)
salt-run git_pillar.update
salt-run fileserver.update
salt-call state.apply

2) Clear cache
почистить на мастере
salt-call saltutil.clear_cache

на миньоне
salt myminion saltutil.clear_cache

3) check state
с мастера
salt myminion state.sls mystate

понедельник, 7 января 2019 г.

Быстрое введение в salt

В паре слов.
Это система деплоя софта на python+yaml+jinja (привет ansible), но в отличии от ансамбля предпочтительна установка агента (есть salt-ssh, но говорят с ним не очень). Синтаксис похожий. Общение между нодами через RabbitMQ.

Про установку.
Ставим мастер, на нужные ноды миньонов, снимаем с мастера хэш ключа и пишем в конфиги миньонов, потом с обоих сторон одобряем взаимодействие. Странно выглядит для автоматизированной настройки, да?

(в роли введения в системы деплоя вообще)
Принудительное введение в системы управления конфигурациями

https://habr.com/post/315012/
https://blog.talpor.com/2014/07/saltstack-beginners-tutorial/
https://docs.saltstack.com/en/getstarted/
https://www.youtube.com/watch?v=yWhvgLqgYR0

saltstack restart service
salt.states.service
salt.modules.service
How to restart a systemd service with salt?