FastNetMon

Saturday, 22 June 2019

PHP FPM dynamic, ondemand or static?

Часто встает вопрос, в каком режиме использовать PHP FPM? Вот есть отличная статья, дающая ответ.

Установка Salt на Ubuntu 18.04

Довольно долгое время раньше я использовал Puppet, но он был крайне проблемен с точки зрения производительности, а также с точки зрения сложности конфигурации. В этом плане Salt намного лучше и понятнее, что я и постараюсь показать.

Как обычно, официальные инструкции можно найти тут и тут

Для работы нам потребуется по меньшей мере две машины - master (сервер) и minion (клиент).

Как для мастера, так и для клиента требуется добавить официальный репозиторий:
wget -O - https://repo.saltstack.com/apt/ubuntu/18.04/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -
echo "deb [arch=amd64] http://repo.saltstack.com/apt/ubuntu/18.04/amd64/latest bionic main" | sudo tee /etc/apt/sources.list.d/saltstack.list
sudo apt-get update
Итак, установим мастер:
sudo apt-get install salt-master
 Так как мастер будет слушать на двух портах, я настоятельно рекомендую сразу же закрыть его фаерволлом от всех машин кроме клиента.

Для этого можно использовать пакет iptables-persistent, ставим его:
sudo apt-get install -y iptables-persistent
 Открываем файл конфигурации
sudo vim /etc/iptables/rules.v4
Создаем конфигурацию (xx замените на адрес клиента, если их неколько, добавьте несколько записей):
 # Generated by iptables-save v1.6.1 on Sat Jun 22 13:34:44 2019
*filter
:INPUT ACCEPT [278:38814]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [231:33098]
# Allow access from clients
-A INPUT -s xx/32 -p tcp -m tcp --dport 4505 -j ACCEPT
-A INPUT -s xx/32 -p tcp -m tcp --dport 4506 -j ACCEPT
# And from localhost
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 4505 -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 4506 -j ACCEPT

# Block all traffic to external hosts to Salt Master
-A INPUT -p tcp -m tcp --dport 4505 -j DROP
-A INPUT -p udp -m udp --dport 4505 -j DROP
-A INPUT -p tcp -m tcp --dport 4506 -j DROP
-A INPUT -p udp -m udp --dport 4506 -j DROP
COMMIT
# Completed on Sat Jun 22 13:34:44 2019
После этого применяем изменения и убеждаемся: что правила добавлены в фаерволл iptables:
sudo systemctl restart netfilter-persistent
Теперь установим клиента:
sudo apt-get install salt-minion
После этого, нам нужно указать адрес мастер сервера в его конфигурации:
sudo vim /etc/salt/minion
И задаем адрес мастера в следующем параметре:
master: xx.aa.zz.bb
Кроме этого, нам потребуется ключ мастер, который нужно получить на мастер сервере следующим образом:
salt-key -F master
And copy string from "master.pub" from Local Key section and insert into /etc/salt/minion in following place:
master_finger: "xx.aa.xx.ggg"
Этот ключ позволит клиенту убедиться, что мастер именно тот, который нам требуется.

После этого применяем конфигурацию:
sudo systemctl restart salt-minion.service
После этого клиент (minion) запросит авторизацию у мастер сервера, илем на мастер сервер и запрашиваем список активных запрсов на авторизацию:
sudo salt-key -L
В ответ вы увидите что-то вида:
Accepted Keys:
Denied Keys:
Unaccepted Keys:
client_hostname
Rejected Keys: 
Одобряем запрос авторизации:
sudo salt-key --accept=client_hostname
Все, после этого с мастер сервера вы можете посылать любые командый конфигурации:
 salt '*' test.version
Но это лишь половина дела, наша задача заключается в автоматическом конфигурировании сервисов на клиенте и это также очень просто!

Создаем основную конфигурацию:
sudo vim /srv/salt/top.sls
Где указываем следующее:
base:
  'client_hostname':
    - php_fpm_setup
Этот файл представляет собой точку входу для конфигурации Salt и здесь можно управлять тем, какие конфигурации должны быть применены на какого клиента.

Итак, создадим саму конфигурацию:
sudo vim /srv/salt/php_fpm_setup.sls
Вот такого вида:
nginx_pkg:
  pkg.installed:
    - name: nginx
nginx_service:
  service.running:
    - name: nginx
    - enable: True
    - require:
      - pkg: nginx_pkg
fpm_pkg:
  pkg.installed:
     - name: php7.2-fpm
fpm_service:
  service.running:
    - name: php7.2-fpm
    - enable: True
    - require:
      - pkg: fpm_pkg
Данный state файл установит на сервер пакеты nginx и php-fpm и настроит их автозапуск.

После этого, данный state можно применить как со стороны клиента:
salt-call state.apply

Так и удаленно, со стороны сервера:
salt '*' state.apply
Выдача в обоих случаях будет аналогичная:
 ---------
          ID: nginx_pkg
    Function: pkg.installed
        Name: nginx
      Result: True
     Comment: All specified packages are already installed
     Started: 15:44:59.405480
    Duration: 57.533 ms
     Changes: 
----------
          ID: nginx_service
    Function: service.running
        Name: nginx
      Result: True
     Comment: The service nginx is already running
     Started: 15:44:59.463924
    Duration: 54.275 ms
     Changes: 
----------
          ID: fpm_pkg
    Function: pkg.installed
        Name: php7.2-fpm
      Result: True
     Comment: All specified packages are already installed
     Started: 15:44:59.518411
    Duration: 18.16 ms
     Changes:   
Все! Таким образом, у вас все конфигурации всех серверов будут находится в одном месте, сразу же рекомендую сделать /srv/salt git репозиторием.