Salt за 10 минут

SaltStack — cистема управления конфигурациями и удалённого выполнения операций.
В данный момент изучаю данную систему и раз уж есть такая возможность решил попереводить статьи с официального сайта и повыкладывать здесь пока хватит энтузиазма. Т.к. у нас в организации используется в основном Red Hat и Centos, переводить буду части касающиеся этих операционных систем.

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


Установка SALT


Установка salt-master, salt-minion из официального репозитория SaltStack на RHEL / CENTOS

sudo yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.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-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.


Источник
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 10

    0
    Чем хуже/лучше Ansible?
      +2
      Чем Ansible. А также чем Chef/Puppet/cfengine/пачка самописных скриптов. У каждого свои религиозные предпочтения. Главное — они делают свою работу.
      0
      Использую 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.
        0
        А почему 3 года назад выбрали именно Salt? Чем руководствовались при выборе?
          0
          Это было не мое решение. До этого использовали chef. Chef не устраивал тем, что в нем не было нормальной push модели, а в salt она была.
            0
            мы выбрали несколько лет назад salt потмоу, что он уже тогда достаточно хорошо поддерживал windows на клиентах.

            У нас, правда, не тысячи хостов (десятки, может будут сотни)
            0
            А какая-нибудь система умеет делать откат действий (пункты 2 и 4)? Уже несколько лет ищу решение, но не вижу, чтобы кто-нибудь над этим заморачивался кроме меня. Даже пытался сделать свой велосипед несколько лет назад, но безуспешно.)
              0
              Версионность есть в шефе (про остальные системы конфигурирования сказать не могу, не использовал) и в deb/rpm пакетах. Откатывать изменения умеет apt и yum (можно установить предыдующую версию пакета). Лично я все свои сервисы оформляю пакетами. К сожалению построение пакетов для многих разработчиков сильно сложнее, чем написание salt state-ов, даже не смотря на наличие такого инструмента, как fpm.
            0
            Какие преимущества перед тем же Ansible?
            Правильно ли я понимаю если мастер сервер по какой-либо причине поменялся то реконфигурировать весь зоопарк миньонов нужно будет руками?
              0
              > Чем хуже/лучше Ansible?
              Чем SaltStack лучше Ansible

              Есть мнение что SaltStack лучше массштабируется чем Ansible.
              Субьективно легче писать расширенную логику для SaltStack.

              Чем Ansible лучше SaltStack-а… Мне нравится поддержка Red Hat за спиной у Ansible, и опять же субьективно, Ansible имеет меньше багов чем SaltStack сейчас.
              Еще нравятся модули Ansible для управления сетевым оборудованием.

              А в чем то похожи. Python, YAML, JINJA.

              Ansible по умолчанию ориентирован на client-less подход.
              SaltStack по умолчанию ориентирован на установку клиента.

              Думаю это неплохой критерий выбора.
              Решить какой подход вам нужен в обозримом будущем, и взять подходящую систему.

              Only users with full accounts can post comments. Log in, please.