Перейти к содержанию

Saltstack

Saltstack

Установка

Master

curl -L https://bootstrap.saltstack.com -o install_salt.sh
sudo sh install_salt.sh -M -x python3

Minion

curl -L https://bootstrap.saltstack.com -o install_salt.sh
sudo sh install_salt.sh

Нужные ключики

# Minion
-A  Pass the salt-master DNS name or IP. This will be stored under
        ${BS_SALT_ETC_DIR}/minion.d/99-master-address.conf

Debian 10

На 10-ке salt будет работать только с поддержкой python3

wget -qO - https://repo.saltstack.com/py3/debian/10/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -
echo "deb http://repo.saltstack.com/py3/debian/10/amd64/latest buster main" >> /etc/apt/sources.list.d/saltstack.list
apt install salt-master salt-minion salt-ssh salt-syndic salt-cloud salt-api

Мастер по-умолчанию слушает порты

tcp    LISTEN     0      128       *:4505 - На этот порт долбятся миньоны за новыми заданиями
tcp    LISTEN     0      128       *:4506 - На этот порт миньоны шлют свои данные (ответы)

Использование

Настройка

Все доступные настройки мастера находятся в файле /etc/salt/master

Папка с pillars

pillar_roots:
  base:
    - /srv/pillar

Но основной файл лучше не править в виду его большого размера, а все настройки производить в соответствующих директориях, добавив в них файл с расширением .conf

# Пример
/etc/salt/master.d/master.conf
/etc/salt/minion.d/minion.conf
/etc/salt/proxy.d/proxy.conf
...

Пример master.conf

state_verbose: False
state_output: mixed
file_roots:
  base:
    - /srv/salt
    - /srv/salt/states
    - /srv/salt/templates
pillar_roots:
  base:
    - /srv/salt/pillar

Команды

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

На мастере

# Показать версии компонентов
salt --versions-report
# Посмотреть все ключи
salt-key --list-all
salt-key -L
# Принять какой-то конкретный
salt-key --accept=<key>
# Принять все ключи
slat-key --accept-all
# Очистить кеш переменных
salt * saltutil.refresh_pillar

Отправка команд

# Проверить доступность миньонов
salt '*' test.ping
# Ввести команду удаленно
salt '*' cmd.run 'ls -l /etc'
# Таргетирование
salt 'minion1' disk.usage
salt 'minion*' disk.usage           # С использованием Globbing
salt -G 'os:Ubuntu' test.ping       # С использованием Grains
salt -E 'minion[0-9]' test.ping     # С использованием регулярки
salt -L 'minion1,minion2' test.ping # Списком
salt -C 'G@os:Ubuntu and minion* or S@192.168.50.*' test.ping # Комбинированный режим
# Применение определенного state
salt '*' state.apply statename
# Тестовый прогон без внесения изменений
salt '*' state.apply statename test=true
# Запуск highstate (применить в стейты)
slat '*' state.apply

# Еще полезные команды
salt 'target' cmd.run 'command'
salt 'target' service.get_enabled
salt 'target' pkg.install git
salt 'target' network.interfaces
salt 'target' disk.usage
salt 'target' sys.doc
salt 'target' pillar.items
salt 'target' grains.items

Полный список исполняемых модулей https://docs.saltstack.com/en/latest/ref/modules/all/

Аргументы

# Ограничено на количество миньонов, на которых будет выполнена команда
salt --batch-size 10
# Вывод данных в нужном формате
... --out=json|yaml

salt-ssh

Нужен для серверов, где нет возможности установить salt minion.

Основной файл настроки /etc/salt/roster, но можно указать и другой файл.

host1:
    host: 192.168.0.1
host2:
    host: host2.example.com
host3:
    host: foo.bar.baz.example.com

Есть возможность задать настройки по-умолчанию в настройках master :

roster_defaults:
    user: salt
    passwd: ***
    sudo: True

На стороне сервера необходимо добавить пользователя salt и разрешить ему выполнять sudo без пароля.

Команды:

# Посмотреть список серверов, добавленных в roster
salt-ssh -H
# Принимаем ключ сервера при работе с новым сервером
slat-ssh -i ...
# Посмотреть тип ОС (в целом команды те же, что и для случая с minon-ом на целевом хосте)
salt-ssh 'host' grains.get 'os'

Файлы и термины

Общий формат файлов в Salt - SLS. SLS файл это смесь данных их шаблонов (по-умолчанию YAML+Jinja).

  • Master - машина, с которой управляются миньоны либо серверы, подключенные через salt-ssh

  • Minion (slave) - процесс, работающий на управляемых машинах

  • States - конечное состояние хоста. Не содержат каких-либо спец. конфигураций, относящихся к конкретному хосту.

  • Highstate - процесс, при котором скачивают top.sls, ищут в нем себя и выполняют states, которые к ним относятся.

  • Top - основной файл, связывающий стейты или переменные с каким-либо миньоном/хостом.

Пример: states/top.sls, который определяет, что на машине host, должны выполняться условия перечисленных состояни.

base:
  'host':
    - users 
    - ntp
    - packages

В папке должны иметься файлы описания состояний users.sls, ntp.sls и packages.sls.

Пример:* pillar/top.sls, который определяет, какие именно серверы ntp должны использоваться, а так же какие пользователи должны быть заведены в системе.

base:
  '*':
    - ntp
    - users

В этом случае в папке pillar так же должны быть файлы ntp.sls и users.sls, в которых перечислены нужные значения.

В общем:

Файл top.sls может находится в папке **/pillar/ и и нужен для связывания переменных с минионами.

Так же top.sls может находиться в папке **/salt/ и выполняет своего рода роль inventory файла.

  • Pillars - переменные для одного или нескольких минионов/хостов.

  • Grains - статичные параметры, полученные от оборудования.

Автоматизация сети

Устанавливат salt-proxy не нужно apt install salt-proxy

Установки прокси миньона NAPALM (для версии солта с 2017.7.3 нужная версия напалма не ниже 2.0.0). Так же в нашем случае salt должен быть установлен с поддержкой python3 (-x python3)

pip3 install napalm

Настраиваем proxy на той же машине где и мастер proxy

master: 127.0.0.1
# Чтобы ключи прокси складывались в отдельную папку
pki_dir: /etc/salt/pki/proxy
multiprocessing: False

/srv/pillar/top.sls

base:
    'bk-dc1':
        - bk-dc1

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

/srv/pillar/bk-dc1.sls

proxy:
    proxytype: napalm
    driver: ios
    host: 10.226.251.9
    username: admin
    passwd: pass
    optional_args:
        secret: passwd

запускаем прокси миньона

 systemctl status salt-proxy@bk-dc1

смотрим логи в /var/log/salt/proxy

Далее необходимо добавить ключ миньона в salt-master

После этого можно слать команды на миньона.

salt 'bk.dc1' snmp.config
salt 'bk.dc1' ntp.peers
salt 'bk.dc1' net.interfaces
salt 'bk.dc1' users.config
# Проверка подключения
salt 'bk.dc1' napalm.alive

Практика

salt 'host' net.load_config text='ntp server 172.17.17.1'

Best practice

https://docs.saltstack.com/en/latest/topics/best_practices.html

Структурирование файлов

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

Например

/srv/salt/mysql/files/
/srv/salt/mysql/client.sls
/srv/salt/mysql/map.jinja
/srv/salt/mysql/python.sls
/srv/salt/mysql/server.sls

Будет иметь вид в top.sls

base:
  'web*':
    - mysql.client
    - mysql.python
  'db*':
    - mysql.server