В данный момент изучаю данную систему и раз уж есть такая возможность решил попереводить статьи с официального сайта и повыкладывать здесь пока хватит энтузиазма. Т.к. у нас в организации используется в основном Red Hat и Centos, переводить буду части касающиеся этих операционных систем.
Данная статья представляет собой перевод официальной документации. Внизу страницы вы найдете ссылку на первоисточник на англ. языке.
Установка SALT
Установка salt-master, salt-minion из официального репозитория SaltStack на RHEL / CENTOS
sudo yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-1.el7.noarch.rpm
Внимание! При установке на Red Hat Enterprise Linux 7 с отключенными (не подписанными на) 'RHEL Server Releases' или 'RHEL Server Optional Channel' репозиториями, добавьте CentOS 7 GPG key URL к конфигурации yum репозитория SaltStack для установки базовых пакетов.
[saltstack-repo] name=SaltStack repo for Red Hat Enterprise Linux $releasever baseurl=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest enabled=1 gpgcheck=1 gpgkey=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest/SALTSTACK-GPG-KEY.pub https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest/base/RPM-GPG-KEY-CentOS-7
sudo yum clean expire-cache
Установите salt-minion, salt-master и другие Salt компоненты:
sudo yum install salt-master salt-minion salt-ssh salt-syndic salt-cloud salt-api
Запуск SALT
Salt работает по топологии Master(сервер) / Minion(клиент). Миньоны подключаются к мастеру на порты TCP 4505,4506.
Дефолтная конфигурация Мастера подходит для подавляющего большинства установок. Salt Master управляется локальными сервис менеджерами:
На системах с systemd (новые Debian, OpenSuse, Fedora, Centos, RHEL):
systemctl start salt-master
На системах с Upstart (Ubuntu, older Fedora/RHEL):
service salt-master start
Альтернативно, Мастер может быть запущен напрямую через командную строку как демон:
salt-master -d
Мастер может быть также запущен в debug режиме, таким образом значительно увеличивая вывод команд:
salt-master -l debug
Мастер принимает входящие соединения на портах TCP 4505,4506.
Поиск SALT MASTER
По умолчанию конфигурационные файлы лежат в каталоге /etc/salt. Большинство платформ придерживаются этой схемы, но такие платформы как FreeBSD и Windows располагают этот файл в других местах.
При старте Миньон по умолчанию ищет в сети хост с hostname salt. Если нашел, то Миньон инициирует процесс рукопожатия и аутентификации по ключу с Мастером. Это означает, что самый простой способ конфигурации это настроить внутренний DNS на разрешение имени salt в IP Мастера.
Если такой подход не устраивает, то можно внести изменения в /etc/salt/minion:
master: hostname_master
или
master: IP_master
Настройка SALT MINION
Миньон может функционировать как с Мастером так и без него. Это руководство предполагает, что Миньон будет подключен к Мастеру, для получения информации о том, как запустить Миньон без Мастера смотрите тут.
После того, как Мастер может быть найден, запустить Миньон можно так же, как Мастера:
На системах с systemd (новые Debian, OpenSuse, Fedora, Centos, RHEL):
systemctl start salt-minion
На системах с Upstart (Ubuntu, older Fedora/RHEL):
service salt-minion start
Как демон:
salt-minion -d
В фоновом режиме с опцией debug:
salt-minion -l debug
Когда Миньон запускается, он генерирует id, если он не был сгенерирован во время предыдущего запуска и кэширует в /etc/salt/minion_id по умолчанию. Это имя по которому Миньон будет пытаться аутентироваться на Мастере. Следующие шаги предпринимаются, чтобы попытаться найти значение отличное от localhost:
- Выполняется функция socket.getfqdn()
- Проверяется /etc/hostname (не на Windows)
- Проверяется /etc/hosts ( %WINDIR%\system32\drivers\etc\hosts на Windows )
Если вышеописанные методы не произвели id отличный от localhost, то проверяется отсортированый лист IP адресов (исключая диапазон 127.0.0.0/8) на Миньоне. Первым используется публично-маршрутизируемый IP-адрес, если есть хоть один. Иначе используется первый приватно-маршрутизируемый IP-адрес.
Если ничего не сработало, то localhost используется как запасной вариант.
id Миньона может быть задан вручную используя параметр id в файле конфигурации Миньона. Если этот параметр задан, то он будет переопределять все другие источники id.
Теперь, когда Миньон запущен, он будет генерировать криптографические ключи и пытаться подключиться к мастеру. Следующим шагом надо вернуться к Мастеру и принять новый открытый ключ Миньона.
Использование SALT-KEY
Salt аутентифицирует Миньонов используя открытый ключ шифрования и аутентификацию. Чтобы Миньон мог начать принимать команды от Мастера его ключ должен быть принят Мастером.
Команда salt-key используется для управления всеми ключами на Мастере. Для просмотра всех ключей, которые находятся на Мастере:
salt-key -L
Будут выведены ключи, которые были приняты, отклонены и находятся в ожидании принятия. Самый простой способ принят ключ миньона это принять все отложенные ключи:
salt-key -A
Ключи должны быть проверены! Выведите отпечаток ключа Мастера запустив salt-key -F master на Мастере. Скопируйте master.pub отпечаток с секции Local Keys и затем установи это значение как master_finger в конфигурации.
# salt-key -F master
Local Keys:
master.pem: 6c:a0:e8:b0:84:36:59:86:b6:49:c3:fb:87:a4:c4:e9
master.pub: d9:c6:e0:42:76:e5:82:f7:13:6a:65:ee:cb:f3:2e:aa
Скопируйте значение отпечатка master.pub из секции Local Keys и установите в качестве параметра master_finger в конфигурационном файле Миньона. Сохраните и перезапустите сервис salt-minion.
На Мастере запустите salt-key -f minion_id, чтобы напечатать отпечаток публичного ключа Миньона, который был принят Мастером. На Миньоне запустите salt-call key.finger --local, чтобы напечатать отпечаток ключа Миньона.
На Мастере:
# salt-key -f foo.domain.com
Unaccepted Keys:
foo.domain.com: 39:f9:e4:8a:aa:74:8d:52:1a:ec:92:03:82:09:c8:f9
На Миньоне:
# salt-call key.finger --local
local:
39:f9:e4:8a:aa:74:8d:52:1a:ec:92:03:82:09:c8:f9
Если совпадают, то примите ключ командой:
salt-key -a foo.domain
Посылка первых команд
Сейчас, когда миньон подключен к Мастеру и аутентифицирован, Мастер может отправлять команды Миньону. Salt-команды позволяют выполнить обширный набор функций и для конкретных Миньонов или групп Миньонов. Salt-команды состоят из опций команд, описания цели, функции исполнения и аргументов функции.
Простая команда выглядит так:
salt '*' test.ping
Звездочка ( * ) определяет цель, которая определяет всех Миньонов. test.ping говорит миньонам запустить функцию test.ping. В случае test.ping, test ссылается на модуль исполнения. ping ссылается на функцию ping содержащуюся в вышеуказанном модуле.
Внимание! Исполнительные модули — это рабочие лошадки Salt. Они выполняют работу в системе выполняя различные задачи, такие как манипулирование файлами и рестарт сервисов.
Результатом выполнения этой команды будет оповещение Мастера, что все миньоны выполнили test.ping параллельно и возвращение результата.
Это на самом деле не ICMP ping, а скорее простая функция, которая возвращает True. Использование test.ping это хороший способ подтверждения что Миньон подключен.
Каждый Миньон регистрирует себя с уникальным ID. Этот ID по умолчанию есть hostname, но может быть явно задан в конфиге Миньона также с помощью параметра id.
Конечно существуют сотни других модулей, которые могут быть вызваны просто как test.ping. В следующем примере возвращается использование диска на всех Миньонах.
salt '*' disk.usage
Знакомство с функциями
Salt поставляется с обширной библиотекой функций, доступных для выполнения и Salt функции являются самодокументирующимися. Чтобы увидеть какие функции доступны на Миньонах выполните sys.doc функцию:
salt '*' sys.doc
Она покажет очень большой список доступных функций и документацию по ним.
Внимание! Документация модулей также может быть доступна на сайте.
Эти функции охватывают все, от управления пакетами до управления серверами баз данных. Они включают в себя мощную систему управления API, которая является основой для управления конфигурациями Salt и многих других сторон Salt.
Внимание!
Salt поставляется с большим кол-вом системных плагинов. Функции, которые доступны по средствам salt команд называются исполнительными модулями.
Полезные функции
Модуль cmd содержит функции которые выполняются на Миньонах, такие как cmd.run и cmd.run_all:
salt '*' cmd.run 'ls -l /etc'
pkg функции автоматически сопоставляют локальный менеджер пакетов с соответствующими функциями. Это означает pkg.install установит пакеты через yum на Red Hat системы, через apt на Debian системы и т.д.:
salt '*' pkg.install vim
Внимание! Некоторые кастомные сборки Linux и производные от некоторых дистрибутивов не правильно определяются определяются Salt. Если приведенная выше команда возвращает ошибку типа pkg.install is not available тогда вы можете переопределить pkg provider. Этот процесс описан здесь.
Функция network.interfaces выводит список всех интерфейсов на Миньоне, вместе с их IP-адресами, масками, MAC-адресами и т.д.:
salt '*' network.interfaces
CHANGING THE OUTPUT FORMAT
Формат вывода по умолчанию используемый для большинства команд Salt называется nested (вложеный), но существуют несколько других способов, которые могут использованы для изменения вывода. Например, pprint способ может быть использован для отображения возвращенных данных использующий Python-кий модуль pprint:
root@saltmaster:~# salt myminion grains.item pythonpath --out=pprint
{'myminion': {'pythonpath': ['/usr/lib64/python2.7',
'/usr/lib/python2.7/plat-linux2',
'/usr/lib64/python2.7/lib-tk',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/site-packages',
'/usr/lib/python2.7/site-packages/gst-0.10',
'/usr/lib/python2.7/site-packages/gtk-2.0']}}
Полный список способов вывода Salt, а также примеры вывода могут быть найдены здесь.
SALT-CALL
Примеры выше описывали запуск команд с Мастера используя salt команду, но при диагностике может быть более эффективным зайти на Миньон по ssh и использовать salt-call.
Это позволяет увидеть сообщения Миньона относящиеся к исполняемой команде (которые не являются частью вывода, который вы видите когда запускаете команду salt), что делает ненужным применение команды tail -f /vat/log/salt/. Более подробную информацию о salt-call можно посмотреть здесь.
Зерна (GRAINS)
Salt ипользует систему, называемую Grains для построения статических данных о Миньонах. Эти данные включают в себя информацию о ОС, CPU архитектуре и много другое. Система grains испольуется Salt для доставки данных платформы многим компанентам и пользователям.
Grains может также быть статическим набором, что делает его легким для присвоения значений Миньонам для группировки и управления.
Обычной практикой является назначение зерен Миньонам, чтобы указать какую роль или роли возможны для Миньон. Эти статические зерна могут быть установлены в конфигурационном файле Миньона или через grains.setval функцию.
Выбор цели
Salt позволяет указывать Миньонов в качестве цели по большому кол-ву критериев.
salt ‘larry1, larry2, curly1’ test.ping
или
salt ‘larry*’ test.ping
или
salt ‘*1’ test.ping
Есть много других способов помимо основных:
Regular Expressions
Используя pcre-совместимые регулярные выражения
Grains
Цель основанная на данных grains: Targeting with Grains
Pillar
Цель основанная на данных pillar: Targeting with Pillar
IP
Цель основанная на IP address/subnet/range
Compound
Цель основанная на нескольких целях: Targeting with Compound
Nodegroup
Target with nodegroups: Targeting with Nodegroup
Передача аргументов
Много функций могут применять аргументы, которые могут быть переданы:
salt ‘*’ pkg.install vim
В этом примере передается аргумент vim функции pkg.install. Много функций могут иметь более сложные аргументы чем просто строка, аргументы обрабатываемые через YAML, позволяющие передавать более сложные данные:
salt ‘*’ test.echo ‘foo: bar’
В этом случае Salt переводит строку ‘foo: bar’ в словарь "{'foo': 'bar'}"
Внимание! Любая строка, которая содержит символ новой строки не будет обработана в YAML.
> Источник
Комментарии (8)
kt97679
12.11.2016 10:50Использую salt уже 3 года. На данный момент число машин (физических и виртуальных) превысило 7000. Сперва использовали стандартную конфигурацию с мастером и миньонами. Работало плохо, подвисали и мастера и миньоны. Перешли на salt-ssh. Стабильность сильно улучшилась, но, к сожалению, salt-ssh нелюбимое дитя saltstack и развивается по остаточному принципу. В процессе работы были обнаружены очень неприятные баги с race conditions. Зафайлил их на гитхабе, позже пофиксил локально через патчи, обновил issue на гитхабе, реакции нет.
Общие претензии к salt следующие:
1. Плохое тестирование, новые версии часто ломают обратную совместимость, каждое обновление до новой версии это боль.
2. Нет версионности для стейтов. Внес изменения, выкатил их, захотел откатить — и вот тут начинаются танцы с саблями, штатных средств нет.
3. Конкретно в salt-ssh очень сложна отладка.
4. salt не отслеживает, какие файлы он создал. Если вы создали файл в стейте, а в следующей версии этот файл должен отсутствовать вам надо добавить явную логику по удалению этого файла, salt не может этого сделать автоматически.
5. В общем и целом пользователи (разработчики) жалуются, что salt не удобен.
6. Код salt крайне сложен для понимания, использует очень много питоновской магии.
К сожалению мы увязли в salt достаточно глубоко, переключиться на что-то другое в данный момент невозможно. Если бы такая возможность была — я бы смотрел в сторону ansible.Amet13
12.11.2016 18:08А почему 3 года назад выбрали именно Salt? Чем руководствовались при выборе?
kt97679
12.11.2016 20:12Это было не мое решение. До этого использовали chef. Chef не устраивал тем, что в нем не было нормальной push модели, а в salt она была.
bormotov
12.11.2016 21:39мы выбрали несколько лет назад salt потмоу, что он уже тогда достаточно хорошо поддерживал windows на клиентах.
У нас, правда, не тысячи хостов (десятки, может будут сотни)
Undiabler
13.11.2016 18:25Какие преимущества перед тем же Ansible?
Правильно ли я понимаю если мастер сервер по какой-либо причине поменялся то реконфигурировать весь зоопарк миньонов нужно будет руками?
jakshi
13.11.2016 18:25> Чем хуже/лучше Ansible?
Чем SaltStack лучше Ansible
Есть мнение что SaltStack лучше массштабируется чем Ansible.
Субьективно легче писать расширенную логику для SaltStack.
Чем Ansible лучше SaltStack-а… Мне нравится поддержка Red Hat за спиной у Ansible, и опять же субьективно, Ansible имеет меньше багов чем SaltStack сейчас.
Еще нравятся модули Ansible для управления сетевым оборудованием.
А в чем то похожи. Python, YAML, JINJA.
Ansible по умолчанию ориентирован на client-less подход.
SaltStack по умолчанию ориентирован на установку клиента.
Думаю это неплохой критерий выбора.
Решить какой подход вам нужен в обозримом будущем, и взять подходящую систему.
n-name
Чем хуже/лучше Ansible?
StamPit
Чем Ansible. А также чем Chef/Puppet/cfengine/пачка самописных скриптов. У каждого свои религиозные предпочтения. Главное — они делают свою работу.