<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Cyberflow</title>
    <description>My Personal Blog</description>
    <link>https://cyberflow.net/</link>
    <atom:link href="https://cyberflow.net/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Wed, 06 Feb 2019 08:34:21 +0000</pubDate>
    <lastBuildDate>Wed, 06 Feb 2019 08:34:21 +0000</lastBuildDate>
    <generator>Jekyll v3.6.2</generator>
    
      <item>
        <title>Запуск logstash pipeline на привелигерованных портах</title>
        <description>&lt;p&gt;Logstash является хорошим сборщиком логов, и хорошо, когда приложение, с которого собираются логи, можно настроить так, чтобы оно слало логи на выбранный порт. Но что делать, если такой возможности нет? Или это вообще не приложение, а некая железка в сети? И умее она слать только на 514 порт?&lt;/p&gt;

&lt;p&gt;Конечно можно сделать перенаправление пакетов на уровне iptables. Но, с моей точки зрения, решение не очень элегантное и тяжело контролируемое.&lt;/p&gt;

&lt;p&gt;Можно воспользоваться &lt;code class=&quot;highlighter-rouge&quot;&gt;CAP_NET_BIND_SERVICE&lt;/code&gt;, однако и это решение имеет минус, связанный с тем, что в нем отсутствует возможность контролировать какие конкретно привелигерованные порты может использовать приложение.&lt;/p&gt;

&lt;p&gt;В этой статье я кратко опишу решение, которое понравилось лично мне.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h2 id=&quot;Настройка-authbind&quot;&gt;Настройка authbind&lt;/h2&gt;
&lt;p&gt;Opensource утилита, позволяющая разрешать приложениям использовать привелигированные порты без прав суперпользователя (root).&lt;/p&gt;

&lt;p&gt;Утилита доступна в репозиториях debian/ubuntu и устанавливается через &lt;code class=&quot;highlighter-rouge&quot;&gt;sudo apt-get install authbind&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Настраивается утилита достаточно просто:
Например, чтобы разрешить приложению, запускаемому под пользователем &lt;code class=&quot;highlighter-rouge&quot;&gt;logstash&lt;/code&gt; использовать порт 514, необходимо сделать следующее:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Создать файл в &lt;code class=&quot;highlighter-rouge&quot;&gt;/etc/authbind/byport/&lt;/code&gt;
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;touch /etc/authbind/byport/!514
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;p&gt;Использование “!” при создании файла указывает на протокол UDP.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Дать прова на созданный файл, соответствующему пользователю:
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;chown logstash /etc/authbind/byport/!514
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;p&gt;Очевидно, что этот шаг указывает какому конкретно пользователю разрешено использовать соответствующий привелигерованный порт.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Дать прова на полное использование файла для пользователя
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;chmod 755 /etc/authbind/byport/!514
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;Настройка-logstash&quot;&gt;Настройка logstash&lt;/h2&gt;
&lt;p&gt;Для того, чтоб logstash получил доступ до привелигерованных портов, необходимо добавить в строку запуска &lt;code class=&quot;highlighter-rouge&quot;&gt;usr/bin/authbind --deep&lt;/code&gt; до запуска самого logstash.&lt;/p&gt;

&lt;p&gt;Это можно сделать путем редактирования юнита systemd. Должно получиться что-то вроде этого:&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[Unit]
Description=logstash

[Service]
Type=simple
User=logstash
Group=logstash
EnvironmentFile=-/etc/default/logstash
ExecStart=/usr/bin/authbind &quot;--deep&quot; &quot;/usr/bin/authbind&quot; &quot;--deep&quot; &quot;/usr/share/logstash/bin/logstash&quot; &quot;--path.settings&quot; &quot;/etc/logstash&quot;
Restart=always
WorkingDirectory=/
Nice=19

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Однако хочется заметить, что logstash имеет свой скрипт настройки юнитов systemd. И, мне кажется, что правильнее использовать его, для настройки systemd юнитов.
Но, к сожалению, их коробки он таких штук, как обертка для запуска не умеет. Но добавить руками эту функцию не сложно. В фале &lt;code class=&quot;highlighter-rouge&quot;&gt;/usr/share/logstash/bin/system-install&lt;/code&gt; надо поправить строчку:&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;program=&quot;$(cd `dirname $0`/..; pwd)/bin/logstash&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;и поправить на:&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;program=&quot;/usr/bin/authbind --deep $(cd `dirname $0`/..; pwd)/bin/logstash&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Теперь запустив этот скрипт мы получим новый systemd юнит с authbind.&lt;/p&gt;
</description>
        <pubDate>Tue, 05 Feb 2019 00:00:00 +0000</pubDate>
        <link>https://cyberflow.net/2019/02/run-logstash-514-ports.html</link>
        <guid isPermaLink="true">https://cyberflow.net/2019/02/run-logstash-514-ports.html</guid>
        
        <category>logstash</category>
        
        <category>authbind</category>
        
        
        <category>elk</category>
        
      </item>
    
      <item>
        <title>testing jekyll language plugins</title>
        <description>&lt;p&gt;Решил потестировать мультиязычный плагин для &lt;a href=&quot;https://jekyllrb.com&quot;&gt;jekyll&lt;/a&gt;.
На просторах сети нашел приличное количество оных, но для первой пробы решил выбрать &lt;a href=&quot;https://github.com/vwochnik/jekyll-language-plugin&quot;&gt;jekyll-language-plugin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Установка плагина подробно описана на &lt;a href=&quot;https://github.com/vwochnik/jekyll-language-plugin/wiki/Getting-Started&quot;&gt;wiki&lt;/a&gt; проекта.&lt;/p&gt;

&lt;p&gt;Однако беглый обзор показал, что реализация данного плагина требует файл с переводами для всего. Если я правильно понял, то пост надо забивать в такой файл, а потом вызывать весь пост как переменную. Возможно я что-то понял не так, но в итоге этот плагин мне не понравился.&lt;/p&gt;

&lt;p&gt;Дальнейшее исследование привело меня к &lt;a href=&quot;https://github.com/Anthony-Gaudino/jekyll-multiple-languages-plugin&quot;&gt;jekyll-multiple-languages-plugin&lt;/a&gt;. Тут уже в документации описано, что статьи или страницы можно хранить в &lt;code class=&quot;highlighter-rouge&quot;&gt;.md&lt;/code&gt; файлах в специпльных “языковых” директориях и импортировать их при помощи &lt;code class=&quot;highlighter-rouge&quot;&gt;% include file %&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Этот вариант понравился мне больше.&lt;/p&gt;

&lt;p&gt;Правда радость была не долгой. Плагин отказался работать “из коробки”. Ошибка в коде, отвечающем за определение статики сайта. В итоге при попытке сбилдить сайт получал &lt;code class=&quot;highlighter-rouge&quot;&gt;jekyll 3.6.2 | Error:  can't dup NilClass&lt;/code&gt;. Добрае люди уже поправили ошибку и сделали &lt;a href=&quot;https://github.com/Anthony-Gaudino/jekyll-multiple-languages-plugin/pull/102/files&quot;&gt;PR&lt;/a&gt; в github, но разработчики не торопяться его принимать. Печалька, но можно поправить руками.&lt;/p&gt;

&lt;p&gt;После патчинга модуля сборка заработала. Создать переводимую страницу (page в терминах jekyll) получилось без особых проблем. Однако для моего блога перевод статей, а точнее его текущее отсутсвие, привело к тому, что после сборки все статьи не сгенерились. После исключения из обработки директории с постами, при помощью директивы &lt;code class=&quot;highlighter-rouge&quot;&gt;exclude_from_localizations&lt;/code&gt; в &lt;code class=&quot;highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; удалось собрать сайт с переведенной страницей и не переведенными постами.&lt;/p&gt;

&lt;p&gt;Пример двухязычной страницы можно посмотреть &lt;a href=&quot;/code/&quot;&gt;тут&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Wed, 13 Dec 2017 16:14:00 +0000</pubDate>
        <link>https://cyberflow.net/2017/12/testing-jekyll-language-plugin.html</link>
        <guid isPermaLink="true">https://cyberflow.net/2017/12/testing-jekyll-language-plugin.html</guid>
        
        <category>jekyll</category>
        
        <category>plugins</category>
        
        <category>bloging</category>
        
        
        <category>jekyll</category>
        
      </item>
    
      <item>
        <title>send kapacitor alert to Icinga 2</title>
        <description>&lt;p&gt;Сталкнулся с необходимостью мониторить метрики собираймые с хостов при помощи &lt;a href=&quot;&quot;&gt;telegraf&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;Описание-задачи&quot;&gt;Описание задачи&lt;/h1&gt;
&lt;p&gt;Есть хост с &lt;a href=&quot;https://www.icinga.com&quot; title=&quot;Icinga2&quot;&gt;icinga2&lt;/a&gt; занимающийся мониторингом разного и рассылающий алерты соответствующим людям. Так же есть метрики с хостов, собираемые &lt;a href=&quot;https://www.influxdata.com&quot; title=&quot;influxdata&quot;&gt;telegraf&lt;/a&gt;, хранящиеся в &lt;a href=&quot;https://www.influxdata.com&quot; title=&quot;influxdata&quot;&gt;influxdb&lt;/a&gt;. Нужно реагировать на метрики и присылать алерты с &lt;a href=&quot;https://www.icinga.com&quot; title=&quot;Icinga2&quot;&gt;incinga2&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;Реагирование-на-метрики&quot;&gt;Реагирование на метрики&lt;/h1&gt;
&lt;p&gt;Можно насти разные подходы для процуссинга метрик с хоста, но разработчики &lt;a href=&quot;https://www.influxdata.com&quot; title=&quot;influxdata&quot;&gt;influxdb&lt;/a&gt; имеют специализированный engine для этой задачи. Дополнительно он решает вопрос реагирования на пики между активными проверками. А этот вопрос обязательно возникнет, если выбрать подход опроса &lt;a href=&quot;https://www.influxdata.com&quot; title=&quot;influxdata&quot;&gt;influxdb&lt;/a&gt; активными проверками со стороны &lt;a href=&quot;https://www.icinga.com&quot; title=&quot;Icinga2&quot;&gt;icinga2&lt;/a&gt;. Таким образом мы вибираем подход в котором данные с хостов процессятся в &lt;a href=&quot;https://www.influxdata.com/time-series-platform/kapacitor/&quot;&gt;kapacitor&lt;/a&gt;.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h1 id=&quot;Настройка-kapacitor-а&quot;&gt;Настройка kapacitor-а&lt;/h1&gt;
&lt;p&gt;Kapacitor имеет таски, в которых описывается что и как должно мониторится. Кроме стандартных &amp;lt;&amp;gt;= можно настроить собственную систему Anomaly Detection. Тут я не буду вдаваться во все подробности. Нас интересует только тот момент, что каждая таска имеет в конфигурации блок &lt;code class=&quot;highlighter-rouge&quot;&gt;alert&lt;/code&gt;. Там можно настроить передачу события в обработчик алертов. В &lt;a href=&quot;https://www.influxdata.com&quot; title=&quot;influxdata&quot;&gt;kapacitor&lt;/a&gt; представленно много уже готовых обработчиков, таких как email, HipChat, Slack, Telegram, PagerDuty, etc. но, к сожалению, нет ни одного, способного нативно отправить событие в &lt;a href=&quot;https://www.icinga.com&quot; title=&quot;Icinga2&quot;&gt;icinga2&lt;/a&gt;. Но разработчики предусмотрели обработчик exec, который может выполнить программу на локальной машине. Его мы и будем использовать.&lt;/p&gt;

&lt;p&gt;Так же отмечу, что для моих нужд оказалось проще и практичнее использовать topic. &lt;code class=&quot;highlighter-rouge&quot;&gt;Topic&lt;/code&gt; - это объект &lt;a href=&quot;https://www.influxdata.com&quot; title=&quot;influxdata&quot;&gt;kapacitor&lt;/a&gt; в который разные таски могут присылать свои события и на этот топик подписывается обработчик этого топика, который одинакого опрабатывает все события в этом топике. Другими словами - если у нас есть несколько метрик для мониторинга, скажем Disk, CPU, Memory. Нам достаточно описать таски для всех и отправлять все события в один топик &lt;code class=&quot;highlighter-rouge&quot;&gt;metric_events&lt;/code&gt; и подключив всего один обработчик пересылать все события в &lt;a href=&quot;https://www.influxdata.com&quot; title=&quot;influxdata&quot;&gt;icinga2&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Пример описания таски с использованием топика:&lt;/p&gt;
&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;s&quot;&gt;stream&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;|from()&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;.measurement('cpu')&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;.groupBy(*)&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;|alert()&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;.warn(lambda&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;usage_idle&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;lt; 20)&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;.crit(lambda&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;usage_idle&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;lt; 10)&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;.topic('metric_events')&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Пример описания топика:&lt;/p&gt;
&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;exec&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;prog&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/path/to/plugin/alert_to_icinga2.py&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;-u&quot;&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;user&quot;&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;-P&quot;&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;password&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Сам же плагин для отправки событий в [icinga2] можно найти по ссылке &lt;a href=&quot;https://github.com/cyberflow/kapacitor_alert_to_icinga2.git&quot;&gt;https://github.com/cyberflow/kapacitor_alert_to_icinga2.git&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Fri, 08 Dec 2017 15:28:00 +0000</pubDate>
        <link>https://cyberflow.net/2017/12/kapacitor-alert-to-icinga2.html</link>
        <guid isPermaLink="true">https://cyberflow.net/2017/12/kapacitor-alert-to-icinga2.html</guid>
        
        <category>monitoring</category>
        
        <category>icinga2</category>
        
        <category>kapacitor</category>
        
        <category>influxdb</category>
        
        <category>metrics</category>
        
        <category>python</category>
        
        <category>telegraf</category>
        
        
        <category>monitoring</category>
        
      </item>
    
      <item>
        <title>Тестирование сайта на jekyll и авто-deploy на github pages</title>
        <description>&lt;p&gt;Как и все в IT сайт нуждается в тестировании. Качество и количество тестов зависит от функциональности и значения сайта. Для своего блога я то же решил использовать тесты. Ну а так как все системные администраторы жутко ленивы, то и настроить автоматическую выкладку новых статей на &lt;a href=&quot;https://pages.github.com&quot;&gt;github pages&lt;/a&gt; (в моем случае через &lt;a href=&quot;http://travis-ci.org&quot;&gt;travis-ci&lt;/a&gt;)&lt;/p&gt;

&lt;h3 id=&quot;html-proofer&quot;&gt;html-proofer&lt;/h3&gt;
&lt;p&gt;Первым инструментом тестирования я выбрал &lt;a href=&quot;https://github.com/gjtorikian/html-proofer&quot;&gt;html-proofer&lt;/a&gt;. Он позволяет проверять ссылки сайта, правильность оформления изображений а так же работоспособность внутренних и внешних скриптов.
Для работы нужно установить gem или добавить строчку в Gemfile:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem 'html-proofer'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;!--more--&gt;

&lt;p&gt;Для быстрой ручной проверки можно выполнить следующие команды:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt; bundle &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;jekyll build
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt; bundle &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;htmlproofer ./_site
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Чтобы не проверять генерируемые jekyll кросслинки (например список категорий), можно добавить в шаблоны тэг &lt;code class=&quot;highlighter-rouge&quot;&gt;data-proofer-ignore&lt;/code&gt;. ТАким образом можно уменьшить количество проверяемых ссылок:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;a&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://notareallink&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data-proofer-ignore&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;Not checked.&lt;span class=&quot;nt&quot;&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Добавляем конфиг для travis-ci:&lt;/p&gt;

&lt;blockquote class=&quot;filename&quot;&gt;
  &lt;p&gt;.travis.yml&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;language&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ruby&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;rvm&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;2.1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;branches&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;only&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;source&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;global&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;NOKOGIRI_USE_SYSTEM_LIBRARIES=true&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;gemfile&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Gemfile&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bundle exec jekyll build&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bundle exec htmlproofer ./_site/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Так же надо добавить строчку в конфиг jekyll:&lt;/p&gt;

&lt;blockquote class=&quot;filename&quot;&gt;
  &lt;p&gt;_config.yml&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;exclude&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;vendor&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;exclude: [vendor]&lt;/code&gt; - крайне важная строчка, т.к. travis ставит gem в корень проекта в директорию vendor. Если не добавить ее в исключения, jekyll будет пытаться обработать фалы gem-ов.&lt;/p&gt;

&lt;p&gt;Тесты можно обернуть в &lt;code class=&quot;highlighter-rouge&quot;&gt;rake&lt;/code&gt; таски для удобства.&lt;/p&gt;

&lt;h3 id=&quot;Автодеплой-на-github-pages&quot;&gt;Автодеплой на github pages&lt;/h3&gt;
&lt;p&gt;После удачного тестирования можно и залить изменения на сайт. Я использую две ветки в репозитории: &lt;code class=&quot;highlighter-rouge&quot;&gt;source&lt;/code&gt; - для хранения исходников постов и потрошков &lt;code class=&quot;highlighter-rouge&quot;&gt;jekyll&lt;/code&gt; и, соответственно, &lt;code class=&quot;highlighter-rouge&quot;&gt;master&lt;/code&gt; - для самого блога. В итоге задача сводится к генерации сайта средствами &lt;code class=&quot;highlighter-rouge&quot;&gt;jekyll&lt;/code&gt; на стороне CI и push в определенную ветку репозитория.
Для этого можно использовать &lt;code class=&quot;highlighter-rouge&quot;&gt;rake&lt;/code&gt; таски ruby. Вот пример:&lt;/p&gt;

&lt;blockquote class=&quot;filename&quot;&gt;
  &lt;p&gt;Rakefile&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;#############################################################################&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;#&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# Modified version of jekyllrb Rakefile&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# https://github.com/jekyll/jekyll/blob/master/Rakefile&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;#&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;#############################################################################&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'rake'&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'yaml'&lt;/span&gt;

&lt;span class=&quot;no&quot;&gt;CONFIG&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;YAML&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;File&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'_config.yml'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;no&quot;&gt;USERNAME&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;CONFIG&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'username'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'GIT_NAME'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;no&quot;&gt;REPO&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;CONFIG&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'repo'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;cyberflow.github.com&quot;&lt;/span&gt;
&lt;span class=&quot;no&quot;&gt;DEST&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;CONFIG&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'destination'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'_deploy'&lt;/span&gt;

&lt;span class=&quot;no&quot;&gt;SOURCE_BRANCH&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'source'&lt;/span&gt;
&lt;span class=&quot;no&quot;&gt;DESTINATION_BRANCH&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'master'&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;check_destination&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;unless&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Dir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;exist?&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;DEST&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;git clone https://&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'GIT_NAME'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'GH_TOKEN'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;@github.com/&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;USERNAME&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;REPO&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.git &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;DEST&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:site&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;desc&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Generate the site and push changes to remote origin'&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;task&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:deploy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Detect pull request&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'TRAVIS_PULL_REQUEST'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;to_s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;to_i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
      &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Pull request detected. Not proceeding with deploy.'&lt;/span&gt;
      &lt;span class=&quot;nb&quot;&gt;exit&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Configure git if this is run in Travis CI&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'TRAVIS'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Configure git'&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;git config --global user.name '&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;USERNAME&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;'&quot;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;git config --global user.email '&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;CONFIG&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'email'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;'&quot;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'git config --global push.default simple'&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Make sure destination folder exists as git repo&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;check_destination&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# sh &quot;git checkout #{SOURCE_BRANCH}&quot;&lt;/span&gt;
    &lt;span class=&quot;no&quot;&gt;Dir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;chdir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;DEST&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;git checkout &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;DESTINATION_BRANCH&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'rm -rf *'&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Generate the site&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;bundle exec jekyll build -d &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;DEST&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Commit and push to github&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sha&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`git log`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sr&quot;&gt;/[a-z0-9]{40}/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;no&quot;&gt;Dir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;chdir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;DEST&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;git status -s&quot;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;git add --all .&quot;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;git commit -m 'Updating to &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;USERNAME&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;REPO&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sha&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.'&quot;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;git push --quiet origin &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;DESTINATION_BRANCH&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; --force&quot;&lt;/span&gt;
      &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Pushed updated branch &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;DESTINATION_BRANCH&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; to GitHub Pages&quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;и теперь можно добавить деплой после удачного тестирования:&lt;/p&gt;

&lt;blockquote class=&quot;filename&quot;&gt;
  &lt;p&gt;.travis.yml&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;...
before_install:
  - openssl aes-256-cbc -K $encrypted_d1eeda8dc2f5_key -iv $encrypted_d1eeda8dc2f5_iv -in travis_rsa.enc -out .travis/travis_rsa -d
script:
  - bundle exec jekyll build
  - bundle exec htmlproofer ./_site/
after_success:
  - eval &quot;$(ssh-agent -s)&quot; #start the ssh agent
  - chmod 600 .travis/travis_rsa # this key should have push access
  - ssh-add .travis/travis_rsa
  - bundle exec rake site:deploy
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ниже пояснения к блокам &lt;code class=&quot;highlighter-rouge&quot;&gt;before_install&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;after_success&lt;/code&gt;. Необходимо добавить ключ для travis, чтобы иметь возможность деплоить в репозиторий.&lt;/p&gt;

&lt;h3 id=&quot;Добавление-ключа-для-деплоя-из-travis&quot;&gt;Добавление ключа для деплоя из travis&lt;/h3&gt;
&lt;p&gt;Для того, чтобы travis смог деплоить наш сайт необходимо проделать еще один шаг. Надо добавить ключ в репозиторий.
Для начала сгенерим новый ключ (я не советую использовать уже созданные ключи). Посмотреть как это нужно делать можно &lt;a href=&quot;https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/&quot;&gt;тут&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt; ssh-keygen &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; rsa &lt;span class=&quot;nt&quot;&gt;-b&lt;/span&gt; 4096 &lt;span class=&quot;nt&quot;&gt;-C&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;travis&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;После этого добавьте сгенеренный ключ в ваш репозиторий в настройках репозитория на github.
Теперь надо закриптовать ключ для travis:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; travis encrypt-file deploy_key
&lt;span class=&quot;go&quot;&gt;encrypting deploy_key for domenic/travis-encrypt-file-example
storing result as deploy_key.enc
storing secure env variables for decryption

Please add the following to your build script (before_install stage in your .travis.yml, for instance):

&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;    openssl aes-256-cbc -K $&lt;/span&gt;encrypted_0a6446eb3ae3_key &lt;span class=&quot;nt&quot;&gt;-iv&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$encrypted_0a6446eb3ae3_key&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-in&lt;/span&gt; super_secret.txt.enc &lt;span class=&quot;nt&quot;&gt;-out&lt;/span&gt; super_secret.txt &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;
Pro Tip: You can add it automatically by running with --add.

Make sure to add deploy_key.enc to the git repository.
Make sure not to add deploy_key to the git repository.
Commit all changes to your .travis.yml.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Sun, 19 Jun 2016 12:46:00 +0000</pubDate>
        <link>https://cyberflow.net/2016/06/jekyll-auto-deploy-and-tests.html</link>
        <guid isPermaLink="true">https://cyberflow.net/2016/06/jekyll-auto-deploy-and-tests.html</guid>
        
        <category>jekyll</category>
        
        <category>testing</category>
        
        
        <category>jekyll</category>
        
      </item>
    
      <item>
        <title>Миграция старых indices elasticsearch на другую ноду</title>
        <description>&lt;p&gt;Я использую &lt;code class=&quot;highlighter-rouge&quot;&gt;elasticsearch&lt;/code&gt; для централизованного хранения логов с серверов. Логов хранится много и каждый новый индекс ест ресурсы на сервере (статью об оптимизации используемых ресурсов для одной ноды можно посмотреть &lt;a href=&quot;/2016/05/optimization-standalone-elasticsearch-in-elk-stack.html&quot;&gt;здесь&lt;/a&gt;). Однако это решение не спасает при хранении логов за очень большие периоды, в связи с чем я решил рассмотреть вариант хранения старых логов на отдельном сервере.&lt;/p&gt;

&lt;p&gt;Т.к. речь идет именно о логах, то шансы изменения данных из прошлого стремятся к нулю. Это позволяет нам не думать о необходимости записи в старые индексы и просто хранить их на сервере (например более дешевом с медленными дисками).
Генеральная идея состоит в том, чтобы добавить дополнительную ноду данных в кластер и распределять индексы (indices) в зависимости от времени их создания.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h2 id=&quot;Настройка-кластера&quot;&gt;Настройка кластера&lt;/h2&gt;

&lt;h3 id=&quot;Настройка-мастер-ноды&quot;&gt;Настройка мастер ноды&lt;/h3&gt;
&lt;p&gt;Пропуская процесс установки &lt;code class=&quot;highlighter-rouge&quot;&gt;elasticsearch&lt;/code&gt; укажу лишь необходимые настройки:&lt;/p&gt;

&lt;blockquote class=&quot;filename&quot;&gt;
  &lt;p&gt;elasticsearch.yml&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;s&quot;&gt;node.master&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;node.data&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;node.node_type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;hot&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;discovery.zen.ping.multicast.enabled&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;discovery.zen.ping.unicast.hosts&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;10.0.0.2&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Нода будет иметь тэг &lt;code class=&quot;highlighter-rouge&quot;&gt;hot&lt;/code&gt; и хранит индексы для быстрого доступа.&lt;/p&gt;

&lt;h3 id=&quot;Настройка-ноды-дынных&quot;&gt;Настройка ноды дынных&lt;/h3&gt;

&lt;blockquote class=&quot;filename&quot;&gt;
  &lt;p&gt;elasticsearch.yml&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;s&quot;&gt;node.master&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;node.data&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;node.node_type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;warm&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;discovery.zen.ping.multicast.enabled&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;discovery.zen.ping.unicast.hosts&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;10.0.0.1&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Нода будет иметь тэг &lt;code class=&quot;highlighter-rouge&quot;&gt;warm&lt;/code&gt; и мы будем перемещать на нее устаревшие indices.&lt;/p&gt;

&lt;h3 id=&quot;Перемещение&quot;&gt;Перемещение&lt;/h3&gt;
&lt;p&gt;После подготовки нод надо перезапустить &lt;code class=&quot;highlighter-rouge&quot;&gt;elasticsearch&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Убедиться, что ноды теперь в кластере можно командой:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; curl http://localhost:9200/_cat/nodes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Следующая команда (для elasticsearch-curator &amp;lt; 4.X) поставит аттрибут аллокации для всех индексов старше 7 дней:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; curator &lt;span class=&quot;nt&quot;&gt;--logfile&lt;/span&gt; /var/log/curator.log &lt;span class=&quot;nt&quot;&gt;--loglevel&lt;/span&gt; INFO &lt;span class=&quot;nt&quot;&gt;--logformat&lt;/span&gt; default &lt;span class=&quot;nt&quot;&gt;--master-only&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--host&lt;/span&gt; localhost &lt;span class=&quot;nt&quot;&gt;--port&lt;/span&gt; 9200 allocation &lt;span class=&quot;nt&quot;&gt;--rule&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;node_type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;warm indices &lt;span class=&quot;nt&quot;&gt;--time-unit&lt;/span&gt; days &lt;span class=&quot;nt&quot;&gt;--older-than&lt;/span&gt; 7 &lt;span class=&quot;nt&quot;&gt;--timestring&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'%Y.%m.%d'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;ниже конфиг &lt;code class=&quot;highlighter-rouge&quot;&gt;action.yml&lt;/code&gt; для elasticsearch-curator &amp;gt;= 4.X:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;actions&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;s1&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;1'&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;allocation&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Apply shard allocation routing to 'node_type=warm' node&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;node_type&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;warm&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;allocation_type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;require&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;wait_for_completion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;False&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;continue_if_exception&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;False&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;filters&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;filtertype&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;pattern&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;prefix&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;logstash-&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;filtertype&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;age&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;creation_date&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;direction&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;older&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;unit&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;days&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;unit_count&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;7&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Теперь можно добавить команду curator-а, описанную выше, в cron сервера и перемещение будет происходить автоматически.&lt;/p&gt;
</description>
        <pubDate>Fri, 03 Jun 2016 12:41:00 +0000</pubDate>
        <link>https://cyberflow.net/2016/06/elasticsearch-cluster-for-old-indice.html</link>
        <guid isPermaLink="true">https://cyberflow.net/2016/06/elasticsearch-cluster-for-old-indice.html</guid>
        
        <category>elasticsearch</category>
        
        
        <category>elasticsearch</category>
        
      </item>
    
      <item>
        <title>Оптимизация standalone сервера elasticsearch</title>
        <description>&lt;p&gt;При использовании &lt;a href=&quot;https://www.elastic.co&quot;&gt;elasticsearch&lt;/a&gt; для сбора и анализа логов возникает вопрос оптимизации для одного сервера. Т.к. &lt;code class=&quot;highlighter-rouge&quot;&gt;elasticsearch&lt;/code&gt; расчитан для использования в кластере, то большинство настроек “по умолчанию” выставлены так, что один сервер работает не эффективно. В этой заметке я разберу несколько примеров оптимизации &lt;code class=&quot;highlighter-rouge&quot;&gt;elasticsearch&lt;/code&gt; для работы на одном сервере.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h3 id=&quot;shards&quot;&gt;Shards&lt;/h3&gt;
&lt;p&gt;Первое что нужно знать, что каждый шард использует пямять и процессор. При использовании &lt;code class=&quot;highlighter-rouge&quot;&gt;elasticsearch&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;logstash&lt;/code&gt; получается, что каждый день &lt;code class=&quot;highlighter-rouge&quot;&gt;logstash&lt;/code&gt; создает новый &lt;code class=&quot;highlighter-rouge&quot;&gt;indice&lt;/code&gt;, а дефолтные настройки &lt;code class=&quot;highlighter-rouge&quot;&gt;elasticsearch&lt;/code&gt; создают 5 шардов в каждом индексе. В итоге с каждым днем кол-во шардов увеличивается вместе с утилизацие памяти и процессора.&lt;/p&gt;

&lt;p&gt;Первое что стоит сделать это изменить глобальные настройки &lt;code class=&quot;highlighter-rouge&quot;&gt;elasticsearch&lt;/code&gt; так, чтобы кол-во шардов было оптимальное. Если не планируется кластер, то и создавать большое кол-во шардов не имеет смысла. За эту настройку отвечает директива &lt;code class=&quot;highlighter-rouge&quot;&gt;index.number_of_shards&lt;/code&gt;. Добавив ее в конфиг можно установить кол-во создаваемых шардов для всех новых индексов. Как мне кажется, при использовании только одного сервера &lt;code class=&quot;highlighter-rouge&quot;&gt;elasticsearch&lt;/code&gt;, логично установить этот параметр равным 1.&lt;/p&gt;

&lt;h3 id=&quot;replics&quot;&gt;Replics&lt;/h3&gt;
&lt;p&gt;Реплики - еще один инструмент кластера &lt;code class=&quot;highlighter-rouge&quot;&gt;elasticsearch&lt;/code&gt;, который взаимодействует с шардами. Кол-во реплик указывают сколько “копий” шардов должно храниться на других нодах кластера, что в случае использования одной ноды не актуально. За эту настройку отвечает директива &lt;code class=&quot;highlighter-rouge&quot;&gt;index.number_of_replicas&lt;/code&gt;. Если сервер один, то и реплицировать некуда, устанавить этот параметр в 0 - логичное решение.&lt;/p&gt;

&lt;p&gt;Однако что делать, если сервер уже работает какое-то время с дефолтными настройками? Можно заметить, что API &lt;code class=&quot;highlighter-rouge&quot;&gt;elasticsearch&lt;/code&gt; возвращает следующее:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;-XGET&lt;/span&gt; http://localhost:9200/_cat/shards
logstash-2016.05.09 1 p STARTED    1520055  985.3mb 127.0.0.1 logstash1
logstash-2016.05.09 1 r UNASSIGNED
logstash-2016.05.09 3 p STARTED    1520640  985.9mb 127.0.0.1 logstash1
logstash-2016.05.09 3 r UNASSIGNED
logstash-2016.05.09 4 p STARTED    1520955  981.4mb 127.0.0.1 logstash1
logstash-2016.05.09 4 r UNASSIGNED
logstash-2016.05.09 2 p STARTED    1520377    966mb 127.0.0.1 logstash1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;где &lt;code class=&quot;highlighter-rouge&quot;&gt;UNASSIGNED&lt;/code&gt; - это шарды-реплики, которые ожидают репликации.&lt;/p&gt;

&lt;p&gt;Исправить это можно следующим обращением к api:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;curl -XPUT &quot;localhost:9200/logstash-2016.05.09/_settings&quot; -d '{
    &quot;index&quot; : {
        &quot;number_of_replicas&quot; : 0
    }
}'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;если количество индексов с шардами, ожидающими репликации большое, то можно воспользоваться следующим однострочником:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;ind &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;-XGET&lt;/span&gt; http://localhost:9200/_cat/shards | &lt;span class=&quot;nb&quot;&gt;grep &lt;/span&gt;UNASSIGNED | awk &lt;span class=&quot;s1&quot;&gt;'{print $1}'&lt;/span&gt; | uniq&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;-XPUT&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;localhost:9200/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ind&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/_settings&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'{ &quot;index&quot; : { &quot;number_of_replicas&quot; : 0 } }'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Thu, 12 May 2016 12:12:00 +0000</pubDate>
        <link>https://cyberflow.net/2016/05/optimization-standalone-elasticsearch-in-elk-stack.html</link>
        <guid isPermaLink="true">https://cyberflow.net/2016/05/optimization-standalone-elasticsearch-in-elk-stack.html</guid>
        
        <category>monitoring</category>
        
        <category>linux</category>
        
        <category>elasticsearch</category>
        
        
        <category>elasticsearch</category>
        
        <category>monitoring</category>
        
        <category>linux</category>
        
      </item>
    
      <item>
        <title>Grafana/nginx auth proxy httpaswd</title>
        <description>&lt;p&gt;Краткое описание настройки &lt;a href=&quot;http://grafana.org&quot;&gt;Grafana&lt;/a&gt; (&amp;gt; 2.0) и nginx с использованием auth basic авторизации через файлы htpasswd.&lt;/p&gt;

&lt;p&gt;Необходимые настройки конфига Grafana:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[server]
protocol = http
http_port = 3000
domain = localhost
http_addr = 127.0.0.1
...
[auth.basic]
enabled=false
[users]
allow_sign_up = false
auto_assign_org = true
auto_assign_org_role = Editor
[auth.proxy]
enabled = true
header_name = X-WEBAUTH-USER
auto_sign_up = true
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;!--more--&gt;
&lt;p&gt;Настройка nginx:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;server {
  listen                &amp;lt;server_ip&amp;gt;:80;

  server_name           &amp;lt;server_hostname&amp;gt;;
  access_log            /var/log/nginx/grafana.access.log;

  location / {
    auth_basic            'Restricted';
    auth_basic_user_file  &amp;lt;path/to/htpasswd_file&amp;gt;;
    proxy_set_header X-WEBAUTH-USER $remote_user;
    proxy_pass http://grafana;
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;После сделать рестарт сервера Grafana и nginx.&lt;/p&gt;
</description>
        <pubDate>Thu, 17 Mar 2016 17:25:00 +0000</pubDate>
        <link>https://cyberflow.net/2016/03/grafana-slash-nginx-auth-proxy-httpaswd.html</link>
        <guid isPermaLink="true">https://cyberflow.net/2016/03/grafana-slash-nginx-auth-proxy-httpaswd.html</guid>
        
        <category>monitoring</category>
        
        <category>linux</category>
        
        <category>grafana</category>
        
        <category>nginx</category>
        
        <category>auth</category>
        
        
        <category>linux</category>
        
        <category>monitoring</category>
        
      </item>
    
      <item>
        <title>Пробрасывание X сессии от пользователя к root</title>
        <description>&lt;p&gt;Сталкнулся с необходимостью запуска графической утилиты на удаленном сервере под пользователем root, но доступ для root по ssh закрыт.&lt;/p&gt;

&lt;p&gt;В итоге нашел такой workaround:&lt;/p&gt;

&lt;p&gt;Заходим на сервер под пользователем прокинув X сессию через ssh:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;ssh &lt;span class=&quot;nt&quot;&gt;-X&lt;/span&gt; user@hostname
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Находим X сессию, потом свитчемся в root:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;xauth list
hostname/unix:10  MIT-MAGIC-COOKIE-1  f714ef310193878cae851635b871d840
~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Добавляем имеющуюся сессию пользователю root&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;~# xauth add hostname/unix:10  MIT-MAGIC-COOKIE-1 f714ef310193878cae851635b871d840
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Все! Можно запускать X приложение под root-ом.&lt;/p&gt;
</description>
        <pubDate>Wed, 09 Sep 2015 15:24:00 +0000</pubDate>
        <link>https://cyberflow.net/2015/09/use-ssh-x-session-from-user-to-root.html</link>
        <guid isPermaLink="true">https://cyberflow.net/2015/09/use-ssh-x-session-from-user-to-root.html</guid>
        
        <category>linux</category>
        
        <category>ssh</category>
        
        <category>xsession</category>
        
        
        <category>notice</category>
        
        <category>linux</category>
        
      </item>
    
      <item>
        <title>Мониторинг dmesg</title>
        <description>&lt;h3 id=&quot;Задача&quot;&gt;Задача&lt;/h3&gt;
&lt;p&gt;Необходимо организовать централизованный сбор логов, в частности сообщений ядра &lt;code class=&quot;highlighter-rouge&quot;&gt;dmesg&lt;/code&gt; и реакции на них со стороны событийного мониторинга (например &lt;em&gt;nagios&lt;/em&gt;).&lt;/p&gt;

&lt;h3 id=&quot;Передача-сообщений-ядра-на-сервер-логов&quot;&gt;Передача сообщений ядра на сервер логов&lt;/h3&gt;
&lt;p&gt;Для передачи сообщения ядра можно использовать модуль &lt;code class=&quot;highlighter-rouge&quot;&gt;netconsole&lt;/code&gt;. Он позволяет передавать сообщения журнала ядра (dmesg) на удаленный компьютер по сети, без участия пространства пользователя (например, syslogd).
Для сбора данных можно использовать, например &lt;a href=&quot;http://logstash.net/&quot;&gt;logstash&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Netconsole может быть встроен в ядро, так и загружен как модуль. Я использую загрузка модуля после загрузки системы, чтобы гарантировать, что сеть уже работает  настроена.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# dmesg -n 7
# modprobe netconsole netconsole=&quot;6665@10.13.77.99/eth1,6666@10.13.77.1/d4:ae:52:cf:33:96&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Первая команда устанавливает уровень логирования для &lt;code class=&quot;highlighter-rouge&quot;&gt;dmesg&lt;/code&gt;.
Вторая загружает модуль &lt;code class=&quot;highlighter-rouge&quot;&gt;netconsole&lt;/code&gt; с параметрами, где:
&lt;!--more--&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;6665 - порт отправки сообщений&lt;/li&gt;
  &lt;li&gt;10.13.77.99 - ip адрес хоста, с которого отправляются сообщения (текущий сервер)&lt;/li&gt;
  &lt;li&gt;eth1 - интерфейс с которого отправляются сообщения&lt;/li&gt;
  &lt;li&gt;6666 - порт, на который принимаются сообщения&lt;/li&gt;
  &lt;li&gt;10.13.77.1 - ip адрес хоста, на который принимаются сообщения&lt;/li&gt;
  &lt;li&gt;MAC - mac адрес интерфейса, на который принимаются сообщения&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Установка &lt;code class=&quot;highlighter-rouge&quot;&gt;logstash&lt;/code&gt; не является темой этой статьи, поэтому я буду показывать лишь части конфига необходимые для реализации задачи. Для получения сообщений от &lt;code class=&quot;highlighter-rouge&quot;&gt;netconsole&lt;/code&gt; надо указать следующий кусок конфига в блоке &lt;code class=&quot;highlighter-rouge&quot;&gt;input&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-properties highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;udp&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;py&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;gt; &quot;netconsole&quot;&lt;/span&gt;
        &lt;span class=&quot;py&quot;&gt;port&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;gt; &quot;6666&quot;&lt;/span&gt;
        &lt;span class=&quot;py&quot;&gt;host&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;gt; &quot;10.13.77.1&quot; }&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;где &lt;code class=&quot;highlighter-rouge&quot;&gt;host&lt;/code&gt; - это ip адрес интерфейса на который будут присылаться сообщения ядра.&lt;/p&gt;

&lt;p&gt;Теперь все сообщения ядра отправляются в &lt;code class=&quot;highlighter-rouge&quot;&gt;logstash&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;Оповещения-при-критических-сообщениях-ядра&quot;&gt;Оповещения при критических сообщениях ядра&lt;/h3&gt;
&lt;p&gt;В моём случае я хочу отслеживать наличие OOM сообщений и рассылать оповещения об этом. &lt;code class=&quot;highlighter-rouge&quot;&gt;Logstash&lt;/code&gt; может отправлять письма с оповещениями сам, но мне интересно делать это событийным мониторингом.&lt;/p&gt;

&lt;p&gt;В качестве событийного мониторинга я использую &lt;a href=&quot;http://www.shinken-monitoring.org&quot;&gt;shinken&lt;/a&gt;. Для реализации оповещения админов, по моему, лучше использовать сервисные чеки &lt;code class=&quot;highlighter-rouge&quot;&gt;is_volatile&lt;/code&gt;. Эта опция позволяет отправлять оповещения на каждый статус non-OK даже если он не менялся. Подробнее об этой опции можно почитать на странице документации https://shinken.readthedocs.io.&lt;/p&gt;

&lt;p&gt;Чтобы не повторяться в описании каждого сервиса напишем template для volatile сервисов:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;define service {
  name                          volatile-service
  check_command                 dummy_ok
  max_check_attempts            1
  check_interval                5
  retry_interval                2
  active_checks_enabled         0
  passive_checks_enabled        1
  check_period                  24x7
  check_freshness               1
  freshness_threshold           300
  flap_detection_enabled        0
  notification_interval         60
  notification_period           24x7
  notification_options          u,c,w
  notifications_enabled         1
  contact_groups                sysadmin
  register                      0
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;В данном описании мы определяем пассивные сервисы, которые будут автоматически сбрасываться в статус ОК через 5 минут после изменения статуса. Так же важно в опции &lt;code class=&quot;highlighter-rouge&quot;&gt;max_check_attempts&lt;/code&gt; указать 1, чтобы сервис сразу после первого сообщения переходил в &lt;code class=&quot;highlighter-rouge&quot;&gt;hard-state&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Теперь можно описать сам сервис используя вышеописанный template:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;define service {
  hostgroup_name                linux
  service_description           log_event
  servicegroups                 logs
  initial_state                 o
  register                      1
  use                           volatile-service
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;С настройкой событийного мониторинга закончили. Переходим к настройке &lt;code class=&quot;highlighter-rouge&quot;&gt;logstash&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Т.к. все сообщения ядра приходят от IP адреса сервера, который его сгенерил, то первое что я рекомендую сделать это настроить для серверов обратную зону, что позволит упростить и дальнейшую работу с логами и передачу сообщений в &lt;em&gt;shinken&lt;/em&gt;. Если обратная зона есть, то можно добавить в блок &lt;em&gt;filter&lt;/em&gt; следующий кусок конфига:&lt;/p&gt;

&lt;div class=&quot;language-properties highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;filter&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;...&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;dns&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;err&quot;&gt;'action'&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;&quot;replace&quot;&lt;/span&gt;
            &lt;span class=&quot;err&quot;&gt;'reverse'&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;[&quot;host&quot;]&lt;/span&gt;
            &lt;span class=&quot;err&quot;&gt;'type'&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;&quot;netconsole&quot;&lt;/span&gt;
        &lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Теперь в поле &lt;code class=&quot;highlighter-rouge&quot;&gt;host&lt;/code&gt; вместо IP адреса сервера будет подставляться последний уровень домена хоста (т.е. если полный домен myserver.my.domain.example.com, то в поле попадёт только myserver). Это упростит жизнь в будущем.&lt;/p&gt;

&lt;p&gt;Далее добавим фильтрацию сообщений, на появления которых хотим получать оповещения. Для примера возьмём строку сообщающую о приходи &lt;em&gt;oom&lt;/em&gt; киллера и будем тагать записи такого типа:&lt;/p&gt;

&lt;div class=&quot;language-properties highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;err&quot;&gt;filter&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;err&quot;&gt;...&lt;/span&gt;
        &lt;span class=&quot;err&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;[message]&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;=~&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;/.+Out.of.memory.+Kill.process.+/&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
           &lt;span class=&quot;err&quot;&gt;noop&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
                  &lt;span class=&quot;err&quot;&gt;'add_tag'&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;[&quot;notify&quot;]&lt;/span&gt;
              &lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;err&quot;&gt;...&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Осталось научить &lt;em&gt;logstash&lt;/em&gt; отправлять сообщения с тэгом &lt;code class=&quot;highlighter-rouge&quot;&gt;notify&lt;/code&gt;. Для отправки на сервер &lt;em&gt;Nagios&lt;/em&gt; можно использовать уже готовые плагины logstash &lt;code class=&quot;highlighter-rouge&quot;&gt;nagios&lt;/code&gt; или &lt;code class=&quot;highlighter-rouge&quot;&gt;nagios_nsca&lt;/code&gt;. Я использую &lt;em&gt;shinken&lt;/em&gt; и хоть он и совместим с &lt;em&gt;Nagios&lt;/em&gt; в большинстве случаев, в этом я предпочёл использовать API &lt;em&gt;shinken&lt;/em&gt;. Для отправки сообщений я написал простенький скрипт на &lt;code class=&quot;highlighter-rouge&quot;&gt;bash&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote class=&quot;filename&quot;&gt;
  &lt;p&gt;log_event_sender.sh&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# WS_Arbiter config&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;USER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;username&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;PASS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;password&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;WS_IP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;192.168.0.55&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;WS_PORT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;7760&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;HOST_NAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SERVICE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$2&lt;/span&gt; | sed &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'s/[[:space:]]/%20/g'&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;RCODE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;2&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;MESSAGE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$3&lt;/span&gt; | sed &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'s/[[:space:]]/%20/g'&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;DATA&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;time_stamp=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;date +%s&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;amp;host_name=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$HOST_NAME&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;amp;service_description=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$SERVICE&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;amp;return_code=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$RCODE&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;amp;output=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$MESSAGE&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SEND&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;USER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;:&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PASS&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$DATA&lt;/span&gt; http://&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WS_IP&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;:&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WS_PORT&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/push_check_result&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Добавляем отправку сообщений с тэгом &lt;code class=&quot;highlighter-rouge&quot;&gt;notify&lt;/code&gt; в конфиг &lt;em&gt;logstash&lt;/em&gt;:&lt;/p&gt;

&lt;div class=&quot;language-properties highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;output&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
       &lt;span class=&quot;err&quot;&gt;'tags'&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;[&quot;notify&quot;]&lt;/span&gt;
       &lt;span class=&quot;err&quot;&gt;'command'&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;&quot;/usr/local/log_event_sender.sh&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;%{host}&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;log_event&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;'%{message}'&quot;&lt;/span&gt;
  &lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Дальнейшее расширение очевидно. Если нужно добавить оповещение о сообщениях другого типа, то нужно просто отлавливать их в &lt;em&gt;logstash&lt;/em&gt; и навешивать тэг &lt;code class=&quot;highlighter-rouge&quot;&gt;notify&lt;/code&gt;.&lt;/p&gt;
</description>
        <pubDate>Wed, 02 Jul 2014 09:58:00 +0000</pubDate>
        <link>https://cyberflow.net/2014/07/monitoring-dmesg.html</link>
        <guid isPermaLink="true">https://cyberflow.net/2014/07/monitoring-dmesg.html</guid>
        
        <category>monitoring</category>
        
        <category>dmesg</category>
        
        <category>oom</category>
        
        <category>logs</category>
        
        <category>logstash</category>
        
        <category>netconsole</category>
        
        <category>linux</category>
        
        <category>shinken</category>
        
        
        <category>monitoring</category>
        
        <category>linux</category>
        
      </item>
    
      <item>
        <title>Erchef no_connect Error</title>
        <description>&lt;h3 id=&quot;Предпосылки&quot;&gt;Предпосылки&lt;/h3&gt;
&lt;p&gt;Столкнулся с тем, что при большом количестве нод в &lt;a href=&quot;http://opscode.com&quot;&gt;chef-server&lt;/a&gt; версий &lt;em&gt;11.0.4&lt;/em&gt; и &lt;em&gt;11.0.8&lt;/em&gt; поставленных из omnibus пакетов для Ubuntu, он с большой периодичностью стал отдавать &lt;code class=&quot;highlighter-rouge&quot;&gt;500 Internal server error&lt;/code&gt; нодам при выполнении куска рецепта, который делает поиск по data_bag’ам. При изучении логов выяснилось следующее:
В логах nginx’a видно, что запросы на поиск отправляются на бэкэнд erchef’а (ядро chef-server написанное на эрланге) и в ответ получаем &lt;code class=&quot;highlighter-rouge&quot;&gt;500&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;192.168.1.111 - - [27/May/2014:11:45:28 +0000] &quot;GET /search/databag1?q=id:node1&amp;amp;sort=X_CHEF_id_CHEF_X%20asc&amp;amp;start=0&amp;amp;rows=1000 HTTP/1.1&quot; 500 &quot;0.051&quot; 36 &quot;-&quot; &quot;Chef Client/11.6.0 (ruby-1.9.3-p429; ohai-6.18.0; x86_64-linux; +http://opscode.com)&quot; &quot;127.0.0.1:8000&quot; &quot;500&quot; &quot;0.046&quot; &quot;11.6.0&quot; &quot;algorithm=sha1;version=1.0;&quot; &quot;auth1&quot; &quot;2014-05-27T11:45:28Z&quot; &quot;2jmj7l5rSw0yVb/vlWAYkK/YBwk=&quot; 1011
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Смотрим далее в логи &lt;code class=&quot;highlighter-rouge&quot;&gt;erchef&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-erlang highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ERROR&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;REPORT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;====&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;May&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2014&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;45&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;28&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;webmachine&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/search/databag1&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;function_clause&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chef_wm_search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;'-make_bulk_get_fun/5-lc$^1/1-2-'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
             &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;no_connections&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
             &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;databag1&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
             &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;src/chef_wm_search.erl&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;233&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]},&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chef_wm_search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fetch_result_rows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
             &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;src/chef_wm_search.erl&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;351&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]},&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chef_wm_search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;make_search_results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
             &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;src/chef_wm_search.erl&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;324&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]},&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chef_wm_search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
             &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;src/chef_wm_search.erl&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;130&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]},&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;webmachine_resource&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resource_call&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
             &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;src/webmachine_resource.erl&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;166&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]},&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;webmachine_resource&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
             &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;src/webmachine_resource.erl&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;125&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]},&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;webmachine_decision_core&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resource_call&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
             &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;src/webmachine_decision_core.erl&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;48&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]},&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;webmachine_decision_core&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;decision&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
             &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;src/webmachine_decision_core.erl&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;532&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]}]}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;К сожалению то, что erchef пишет в свой лог не информативно. Однако путём длительного перебора удалось понять, что проблема в соединении к базе.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h3 id=&quot;Решение&quot;&gt;Решение&lt;/h3&gt;
&lt;p&gt;Суть проблемы в том, что erchef открывает &lt;em&gt;N&lt;/em&gt; соединений к базе &lt;em&gt;postgresql&lt;/em&gt; (по умолчанию 20) и вываливается с выше указанной ошибкой, если этих 20-и соединений ему не хватает.
Чтобы увеличить количество соединений нужно поправить конфиг erchef’a.&lt;/p&gt;

&lt;blockquote class=&quot;filename&quot;&gt;
  &lt;p&gt;/var/opt/chef-server/erchef/etc/app.config&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-erlang highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pooler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
           &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pools&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[[{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;sqerl&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
                     &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
                     &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;init_count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
                     &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;start_mfa&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sqerl_client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;start_link&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]}}]]},&lt;/span&gt;
           &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;metrics_module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;folsom_metrics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;p&quot;&gt;]},&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Правим значения для &lt;code class=&quot;highlighter-rouge&quot;&gt;max_count&lt;/code&gt; и &lt;code class=&quot;highlighter-rouge&quot;&gt;init_count&lt;/code&gt; с 20 на большие. В моём случае пока хватает 60 и 40.&lt;/p&gt;
</description>
        <pubDate>Wed, 28 May 2014 09:42:00 +0000</pubDate>
        <link>https://cyberflow.net/2014/05/erchef-no-connect-error.html</link>
        <guid isPermaLink="true">https://cyberflow.net/2014/05/erchef-no-connect-error.html</guid>
        
        <category>chef</category>
        
        <category>chef-server</category>
        
        <category>erchef</category>
        
        <category>error</category>
        
        <category>no_connections</category>
        
        
        <category>chef</category>
        
      </item>
    
  </channel>
</rss>
