Олег Букатчук

Установка, настройка и первые шаги с Salt Stack в Debian Linux

Авг
28

Salt Stack новый продукт на рынке систем управления инфраструктурой его легко использовать и начать управлять сотнями или даже тысячами серверов. В этой статье я расскажу в подробной форме, как и что нужно выполнять чтобы установить сервер (master) и клиент (minion).

И так, у меня есть 2 cервера на Debian 8 (jessie):

  • первый имеет доменное имя salt.company.com и будет выполнять роль Master (Salt-сервер) его ip-адрес 11.22.33.44
  • второй имеет доменное имя client.company.com и будет выполнять роль Minion (Salt-клиент) его ip-адрес 44.33.22.11

Подготовка

Установим удобный и простой в использовании текстовый редактор Nano.

$ sudo apt-get install nano

В начале займёмся главным узлом нашей платформы Salt-сервером (master), установим и настроим его.

Установка и настройка Salt-сервера (master)

Добавляем ключ репозитория Salt Stack, чтобы наш Salt-сервер принял дистрибутив, как доверенный к установке.

wget -O - https://repo.saltstack.com/apt/debian/8/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -

Создадим файл репозитория Salt Stack.

$ sudo touch /etc/apt/sources.list.d/saltstack.list

Открываем файл /etc/apt/sources.list.d/saltstack.list

$ sudo nano /etc/apt/sources.list.d/saltstack.list

Добавим в него описание репозитория и путь к нужным нам пакетам.

# Salt Stack
deb http://repo.saltstack.com/apt/debian/8/amd64/latest jessie main

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

$ sudo apt-get update
$ sudo apt-get upgrade

Установим актуальную версию языка Python, дело в том, что Salt Stack написан на этом языке и без этого интерпретора ничего работать не будет (версия Python2.7 НЕ подойдёт!).

$ sudo apt-get install python3.4

Ставим пакеты Salt Stack. Их несколько: salt-master (сервер), salt-minion (клиент), salt-ssh (поддержка общения сервера с клиентами через безопасное шифрованное соединение). О пакетах salt-syndic, salt-cloud и salt-api я расскажу чуть позже, но поставим мы их сейчас, чтобы потом к процессу установки не возвращаться.

$ sudo apt-get install salt-master 
$ sudo apt-get install salt-minion
$ sudo apt-get install salt-ssh
$ sudo apt-get install salt-syndic
$ sudo apt-get install salt-cloud
$ sudo apt-get install salt-api

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

$ sudo cp /etc/salt/master /etc/salt/master_original

Теперь открываем конфигурационный файл по умолчанию и удаляем построчно всё содержимое с помощью комбинации клавиш ctrl+k.

$ sudo nano /etc/salt/master

Затем копируем уже подготовленный рабочий конфигурационный файл и сохраняемся.

default_include: master.d/*.conf
interface: 11.22.33.44
publish_port: 4505
user: root
max_open_files: 100000
worker_threads: 5
ret_port: 4506
pidfile: /var/run/salt-master.pid
root_dir: /
pki_dir: /etc/salt/pki
cachedir: /var/cache/salt/master
extension_modules: srv/modules
job_cache: True
minion_data_cache: True
open_mode: False
auto_accept: False
token_expire: 43200
runner_dirs: []
cython_enable: False
state_top: top.sls
renderer: yaml_jinja
failhard: False
state_verbose: True
state_output: full
base:
- /srv/salt
hash_type: sha256
file_buffer_size: 1048576
order_masters: False
log_file: /var/log/salt/master
log_level_logfile: error, critical, warning
log_datefmt_logfile: '%Y-%m-%d %H:%M:%S'
log_fmt_logfile: '%(asctime)s,%(msecs)03.0f [%(name)-17s][%(levelname)-8s] %(message)s'

Перезапускаем сервис Salt-сервера.

$ sudo service salt-master restart

В случае, если вы используете фаервол, то для Salt-сервера и его клиентов нужно открыть порты 4505 и 4506 (4505 порт используется для соединения миньёнов с сервером, а порт 4506 нужен для передачи файлов):

$ sudo iptables -A INPUT -p tcp --dport 4505 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 4506 -j ACCEPT

Смотрим всё ли у нас открыто для нормального обмена траффиком между Salt-сервером и клиентами.

$ netstat -nltp

Наконец добавляем в автозагрузку наш Salt-сервер (master).

$ sudo echo "salt-master on" >> /etc/rc.local

На этом первоначальная (минимальная) настройка Salt-сервера (master) завершена и мы переходим к установке и настройке Salt-клиента (minion).

Установка и настройка Salt-клиента (minion)

Аналогично тому, как мы настраивали репозиторий для Salt-сервера (master) создадим файл репозитория на сервере который будет выступать в роли Salt-клиента (minion).
Добавляем ключ репозитория Salt Stack, чтобы наш Salt-клиент принял дистрибутив, как доверенный к установке.

wget -O - https://repo.saltstack.com/apt/debian/8/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -

Создадим файл репозитория Salt Stack на Salt-клиенте.

$ sudo touch /etc/apt/sources.list.d/saltstack.list

Открываем файл /etc/apt/sources.list.d/saltstack.list

$ sudo nano /etc/apt/sources.list.d/saltstack.list

Добавим в него описание репозитория и путь к нужным нам пакетам.

# Salt Stack
deb http://repo.saltstack.com/apt/debian/8/amd64/latest jessie main

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

$ sudo apt-get update
$ sudo apt-get upgrade

Также не забываем про установку языка Python, дело в том, что Salt Stack написан на этом языке и без этого интерпретатора Salt-клиент (minion) работать не будет (версия Python2.7 НЕ подойдёт!).

$ sudo apt-get install python3.4

Ставим пакеты Salt Stack. Их несколько: salt-minion (клиент), salt-ssh (поддержка общения сервера с клиентами через безопасное шифрованное соединение). Пакеты salt-syndic, salt-cloud и salt-api ставим в прок для расширения функционала Salt Stack конфигурации в будущем, чтобы потом к процессу установки не возвращаться.

$ sudo apt-get install salt-minion
$ sudo apt-get install salt-ssh
$ sudo apt-get install salt-syndic
$ sudo apt-get install salt-cloud

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

$ sudo cp /etc/salt/minion /etc/salt/minion_original

Теперь открываем конфигурационный файл /etc/salt/minion и удаляем построчно всё содержимое с помощью комбинации клавиш ctrl+k. Затем копируем уже подготовленный рабочий конфигурационный файл и сохраняемся.

default_include: minion.d/*.conf
master: 44.33.22.11
master_port: 4506
user: root
pidfile: /var/run/salt-minion.pid
root_dir: /
pki_dir: /etc/salt/pki/minion
cachedir: /var/cache/salt/minion
verify_env: True
cache_jobs: False
sock_dir: /var/run/salt/minion
backup_mode: minion
acceptance_wait_time: 10
random_reauth_delay: 60
ipc_mode: ipc
tcp_pub_port: 4510
tcp_pull_port: 4511
cython_enable: False
renderer: yaml_jinja
autoload_dynamic_modules: True
clean_dynamic_modules: True
environment: None
file_client: remote
hash_type: sha256
open_mode: False
state_verbose: True
state_output: full
multiprocessing: True
log_file: /var/log/salt/minion
log_level: warning, error, critical
log_datefmt_logfile: '%Y-%m-%d %H:%M:%S'
log_fmt_logfile: '%(asctime)s,%(msecs)03.0f [%(name)-17s][%(levelname)-8s] %(message)s'

Перезапускаем сервис Salt-сервера.

$ sudo service salt-minion restart

Проверяем статус Salt-клиента (minion).

$ sudo service salt-minion status

Смотрим всё ли у нас открыто для нормального обмена траффиком между Salt-сервером и клиентами.

$ netstat -nltp

Наконец добавляем в автозагрузку наш Salt-клиент (minion).

$ sudo echo "salt-minion on" >> /etc/rc.local

На этом первоначальная (минимальная) настройка Salt-клиента (minion) завершена и мы переходим к самому интересному, а именно добавлению Salt-клиентов на Salt-сервер.

Добавление Salt-клиентов на Salt-сервер

Теперь приступаем к добавлению Salt-клиентов (minion-ов) на Salt-клиентов (master).

Сейчас, minion-ы пытаются авторизовать себя по ключу на Salt-сервере (master). Выполните следующую команду, чтобы увидеть всех Salt-клиентов на Salt-серевере (Выполняем данную команду на самом Salt-серевере):

$ sudo salt-key -L

Вы должны получить что-то типа:

Accepted Keys:
Denied Keys:
Unaccepted Keys:
client.company.com
Rejected Keys:

Авторизуем наш Salt-клиент (команда с ключом -A авторизует сразу всех клиентов):

$ sudo salt-key -A

Также можно авторизовывать клиента по имени, ключом -a.

$ sudo salt-key -a client.company.com

Вывод, будет тем же.

The following keys are going to be accepted:
Unaccepted Keys:
client.company.com
Proceed? [n/Y] Y
Key for minion client.company.com accepted.

Проверяем:

$ sudo salt-key -L

Вывод показывает, что клиент перешел в раздел Accepted Keys.

Accepted Keys:
client.company.com
Denied Keys:
Unaccepted Keys:
Rejected Keys:

Тестирование установленного Salt Stack

Проверим связку клиента с сервером командой ping для всех авторизованных Salt-клиентов (minion-ов), у нас он пока один, но не суть.

$ sudo salt '*' test.ping 

Вывод будет таким.

client.company.com:
 True

Так же, можно использовать regexp в названии клиента, например.

$ sudo salt '*.company.com' test.ping

Можно проверять статус конкретного Salt-клиента (ноды):

$ sudo salt 'client.company.com' test.ping

Использование Salt Stack в боевом режиме

Следующие команды стоит выполнять с Salt-сервера (master) для управления Salt-клиентами (minion-ами).

Узнать hostname на всех нодах (имена хостов):

$ sudo salt '*' grains.item host

Узнать ОС (операционную систему).

$ sudo salt '*' grains.item os

Поиск файлов по имени.

$ sudo salt '*' file.find /etc name=host\*.\*

Проверка использованного диска.

$ sudo salt '*.company.com' disk.usage

Также можно отображать данные в процентах:

$ sudo salt '*.company.com' disk.percent /

Вывести права в файловой системе для папки или файла.

$ sudo salt '*' acl.getfacl /home/some_user

Поиск слов (фраз) в файлах на Salt-клиенте.

$ sudo salt '*' file.contains /etc/ssh/sshd_config 'Port'

Редактирование содержимого файлов на Salt-клиентах.

$ sudo salt '*' file.sed /etc/ssh/sshd_config 'Port 22' 'Port 2222'

Создание директории на Salt-клиентах.

$ sudo salt '*.company.com' file.makedirs /tmp/folder_name/

Создать пустой файл на Salt-клиентах.

$ sudo salt '*.company.com' file.touch /tmp/folder_name/file_name

Удалить дерево каталогов на Salt-клиентах.

$ sudo salt '*' file.remove /tmp/folder_name/

Управление файлом /etc/hosts на Salt-клиентe.

$ sudo salt 'client.company.com' hosts.add_host 44.33.22.11 client.company.com

Управление службами

Посмотреть все имеющиеся сервисы.

$ sudo salt '*' service.get_all

Получение статуса веб-сервера на apache2.

$ sudo salt '*' service.status apache2

Перезапустить SSH на нодах можно такой командой.

$ sudo salt '*' service.reload ssh

Выключить Rsync на всех Salt-клиентах.

$ sudo salt '*' service.disable rsync

Получить все выключенные службы на клиентах.

$ sudo salt '*' service.get_disabled

Вы получите errors (ошибки), если служба не установлена.

Установка пакетов для нод с сервера Salt-сервера

Вы можете установить пакеты одной командой на все Salt-клиенты сразу.

$ sudo salt '*' pkg.install apache2

После установки, мы можем проверить результат.

$ sudo salt '*' cmd.run apache2

Чтобы перезапустить Salt-клиентов (minion-ов) на всех нодах, стоит выполнить.

$ sudo salt '*' cmd.run "/etc/init.d/salt-minion restart"

Получаем, такой вывод.

client.company.com:
 Restarting salt minion control daemon: salt-minion.

Управление пользователями на нодах с Salt-сервера

Чтобы добавить пользователя, выполните.

$ sudo salt '*' user.add user_name

Установить полное имя пользователя.

$ sudo salt '*' user.chfullname user_name "My username"

Добавление пользователя user_name в группу ssh.

$ sudo salt '*' user.chgroups user_name ssh True

Проверяем, в каких группах состоит пользователь user_name.

$ sudo salt '*' user.list_groups user_name

Установить оболочку для пользователя user_name.

$ sudo salt '*' user.chshell user_name /bin/bash

Установить пароль (123123) для пользователя user_name.

$ sudo salt '*' shadow.set_password user_name '$1$jH24ZsgO$SRGy3SUSgGeoSCMFJk0TU/'

Удалить созданного пользователя user_name.

$ sudo salt '*' user.delete user_name remove=True force=True

Команды-командами, но Salt Stack может не только это.

Полезные команды Salt Stack

Чтобы посмотреть как и что прописано, выполните для Salt-сервера (master).

$ grep -E -v '^#|^ *$' /etc/salt/master

Чтобы посмотреть как и что прописано, выполните для Salt-клиента (minion).

$ grep -E -v '^#|^ *$' /etc/salt/minion

Чтобы выключить все Salt-клиенты (minion-ы), выполните на Salt-сервере команду.

$ sudo salt '*' cmd.run "poweroff"

Показать статус для Salt-клиентов (minion-ов), все включенные ноды.

$ sudo salt-run manage.up

Показать статус для Salt-клиентов (minion-ов), все выключенные ноды.

$ sudo salt-run manage.down

Показать статус для всех нод.

$ sudo salt-run manage.status

Тема оркестрации для меня очень актуальна и набирает популярность во всём мире так, что в будущем я продолжу рассказывать о своём опыте удалённого конфинурирования парка серверов. Ждите новых статей!