Установка SALT Stack в Unix/Linux

Установка SALT Stack в Unix/Linux

Что такое  Salt Stack?
Salt является новый подходом к управлению инфраструктурой. Его легко использовать чтобы за считанные минуты, развернуть его и начать управлять десятками тысяч серверов.  В своей статье «Установка SALT Stack в Unix/Linux» я расскажу как можно установить SALT Stack в Unix/Linux, на готовом примере. В более подробной форме, я расскажу как и что нужно выполнять чтобы изучить данную тему. Для меня, эта тема — новая и я с ней сталкиваюсь первый раз.

Почему именно Salt Stack?

  • Простота установки (мастера и миньенов).
  • Простота настройки.
  • Простота использования.

Предпосылки

И так, у меня имеется следующие ресурсы:

  1. Сервер на операционной системе CentOS 6.7 — будет использоваться для salt-master (сервера salt).
  2. Сервер на операционной системе Debian 8 — будет использоваться для salt-node (клиент salt).

Так как  — мне достаточно 2-х серверов чтобы рассказать принципы работы SALT (Можно и один, но для наглядности, я выбрал именно 2 разные ОС на 2-х разных серверах).

Установка дополнительных утилит:

Для Debian/Ubuntu:

# apt-get install screen vim

Для CentOS/Fedora/RHEL:

# yum install screen vim

Установка SALT Stack в Unix/Linux

Расскажу как можно выполнить установку SALT на CentOS и Debian. Возможно (если будет потребность), я добавлю материал и для других Unix/Linux ОС.

Настройка репозитория в Debian для SALTSTACK:

Создаем файл (открываем его):

# vim /etc/apt/sources.list.d/salt_repo.list

И в него прописываем:

deb http://debian.saltstack.com/debian wheezy-saltstack main

Но для быстроты использования, я рекомендую использовать команды:

# echo "deb http://debian.saltstack.com/debian wheezy-saltstack main" | tee /etc/apt/sources.list.d/salt_repo.list
# wget -q -O- "http://debian.saltstack.com/debian-salt-team-joehealy.gpg.key" | apt-key add -
# apt-get update

Настройка репозитория в CentOS для SALTSTACK:

Для CentOS нужен репозиторий EPEL:

Как включить EPEL репозиторий на CentOS

В случае, если вы имеете любой брандмауэр, то для  Salt-master и его minions нужно открыть порты 4505 и 4506:

# iptables -A INPUT -p tcp --dport 4505 -j ACCEPT
# iptables -A INPUT -p tcp --dport 4506 -j ACCEPT

4505 – Нужен для работы миньенов с сервером.
4506 – Нужен для передачи файлов.

После чего, выполняем установку.

Установка SALT master в Unix/Linux.

Выберите команду и выполните ее.

Установка MASTER на Debian/Ubuntu:

# apt-get install salt-master -y

Установка MASTER на Centos/RedHat/Fedora:

# yum install salt-master -y

 Настройка salt-master

Открываем конфиг с salt-master, для редактирования выполните:

# vim /etc/salt/master

Я привел к такому виду:

default_include: master.d/*.conf
interface: 192.168.103.132
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
file_roots:
base:
- /srv/salt
hash_type: md5
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-master

PS: Нужно поменять IP в данном конфиге, поле:

[...]
interface: 192.168.103.132
[...]

Перезапускаем salt мастер:

# service salt-master restart

После чего смотрим:

# netstat -nltp

Должны быть открыты порты. Вроде бы все в порядке, идем дальше.

Можно добавить salt-master в автозагрузку ОС:

# /sbin/chkconfig salt-master on

Установка SALT minions в Unix/Linux.

Выберите команду и выполните ее.

Установка minions на Debian/Ubuntu.

Есть несколько способов создания миньенов (minions), чтобы найти salt-master. Я думаю что самый простой способ — это сделать запись на каждой ноде (миньене), а именно в /etc/hosts. В моем случае это:

# echo "192.168.103.133 salt-minion" >> /etc/hosts

и после чего выполняем установку salt-minion на debian:

# apt-get install salt-minion -y

Запускаем его:

# service salt-minion restart

Установка minions на CentOS.

Есть несколько способов создания миньенов (minions), чтобы найти salt-master. Я думаю что самый простой способ — это сделать запись на каждой  ноде (миньене), а именно в /etc/hosts. В моем случае это:

# echo "192.168.103.132 salt-minion" >> /etc/hosts

После этого, выполняем установку:

# yum install salt-minion

Добавляем миньена в автозагрузку и запускаем его:

# chkconfig salt-minion on 
# service salt-minion start

Имеются и другие компоненты и вы можете их усатновить:

# yum install salt-ssh
# yum install salt-syndic
# yum install salt-cloud

PS: Мне они не понадобились в этой статье.

Настройка salt-minion.

Открываем:

# vim /etc/salt/minion

Я привел конфиг к такому виду:

default_include: minion.d/*.conf
master: 192.168.103.132
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: md5
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-minion

PS: Нужно поменять IP в данном конфиге, поле:

[...]
interface: 192.168.103.132
[...]

После чего, перезапускаем salt-minion следующей командой:

# service salt-minion restart

Можно посмотреть статус миньена:

# service salt-minion status

PS: Я установил миньена и на сервере, чтобы показать как оно работает. Вроде бы все настроено и работает, следующим действием — авторизация миньенов на salt-master.

Авторизация minion-ов на salt-master.

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

# salt-key -L

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

# salt-key -L

Accepted Keys:
Denied Keys:
Unaccepted Keys:
192.168.0.60
debian.debian.home
Rejected Keys:

192.168.0.60 — это миньен с самого сервера salt.
debian.debian.home — это выделенная нода с minion-ом.

Всех миньенов следуюет авторизовать (сразу все, ключ «-A»):

# salt-key -A

Или можно авторизовывать по имени, например (служит ключ «-a»):

# salt-key -a 192.168.0.60

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

Проверяем:

# salt-key -L

Accepted Keys:
192.168.0.60
Denied Keys:
Unaccepted Keys:
debian.debian.home
Rejected Keys:

Чтобы запустить команду «ping» для всех авторизированных minion-ов, выполните:

# salt '*' test.ping

192.168.0.60:
 True

Можно проверять статус конкретной ноды:

# salt '192.168.0.60' test.ping

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

Запустить команду PING на все запущенные ноды с minion-ами с Salt-Master:

# salt '*' test.ping

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

# salt '192.168.0.*' test.ping

или:

# salt '192*' test.ping

Допустим, у вас как и у меня миньены в виде IP адресов, и вам нужно исключить некоторые:

# salt '192.[!168]*' test.ping

Использование команд в Salt Stack (Single usage).

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

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

# salt '*' grains.item host

получаем:

debian.debian.home:
 ----------
 host:
 debian
192.168.0.60:
 ----------
 host:
 localhost

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

# salt '*' grains.item os

получаем:

debian.debian.home:
 ----------
 os:
 Debian
192.168.0.60:
 ----------
 os:
 CentOS

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

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

получаем:

192.168.0.60:
 - /etc/host.conf
 - /etc/hosts.allow
 - /etc/hosts.deny
debian.debian.home:
 - /etc/host.conf
 - /etc/hosts.allow
 - /etc/hosts.deny
 - /etc/init.d/hostname.sh

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

# salt '192*' disk.usage

Или отображать данные в процентах:

# salt '192*' disk.percent /

192.168.0.60:
42%

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

# salt '*' acl.getfacl /home/captain

Поиск слов (фраз) в файлах:

# salt '*' file.contains /etc/ssh/sshd_config 'Port'

Получаем:

debian.debian.home:
 False
192.168.0.60:
 True

Редактирование текста в файлах:

# salt '*' file.sed /etc/ssh/sshd_config 'Port 22' 'Port 2201'

Получаем:

192.168.0.60:
 ----------
 pid:
 9688
 retcode:
 0
 stderr:
 stdout:

Создание папки:

# salt '192.168.*' file.makedirs /tmp/my_folder/

Получаем:

192.168.0.60:
 None

Создать пустой файл:

# salt '192*' file.touch /tmp/my_folder/my_empty_file_here

Получаем:

192.168.0.60:
 True

Удалить дерево каталогов:

# salt '*' file.remove /tmp/my_folder/

Получаем вывод:

192.168.0.60:
 True

Управление файлом /etc/hosts:

# salt '19*' hosts.add_host 66.66.99.99 99.66.localhost

Получаем вывод:

192.168.0.60:
 True

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

Управление службами на нодах с master-а (посмотреть все имеющиеся):

# salt '*' service.get_all
 - bluetooth
 - certmonger
 - control-alt-delete
 - cpuspeed
 - crond

Получение статуса сервера на nginx: 

# salt '*' service.status nginx

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

# salt '*' service.reload ssh

Выключить Rsync на каждой из нод:

# salt '*' service.disable rsync

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

# salt '*' service.get_disabled

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

Установка пакетов для нод с сервера salt (Master-а) под управлением ОС CentOS.

Мы можете установить пакеты одной командой на все ноды сразу (я выполню только для одной):

# salt '19*' pkg.install subversion

Получаем вывод:

192.168.0.60:
 ----------
 perl-URI:
 ----------
 new:
 1.40-2.el6
 old:
 subversion:
 ----------
 new:
 1.6.11-15.el6_7
 old:

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

# salt '1*' cmd.run "svn --version --quiet"

Получаем результат:

192.168.0.60:
 1.6.11

Установка MYSQL на ноды под управление ОС Debian.

И так, выполним команду чтобы установить некоторый пакет на ноду с Debian с сервера Salt:

# salt 'debian*' pkg.install python-mysqldb

Получаем:

debian.debian.home:
 ----------
 python-mysqldb:
 ----------
 new:
 1.2.3-2.1
 old:
 python2.6-mysqldb:
 ----------
 new:
 1
 old:
 python2.7-mysqldb:
 ----------
 new:
 1
 old:

Если вы попробуете выполнить эту команду на всех нодах, то может это может повредить CentOS. Вы можете увидеть детали в /var/log/salt/minion, но нужно прописать LogLevel в /etc/salt/minion.

Если вы хотите менеджить mysql через Salt Stack, то вы должны и меть файл mysql_salt.conf:

# salt 'deb*' file.append /etc/salt/minion.d/mysql_salt.conf \ "mysql.host: 'localhost'" \ "mysql.port: 3306" \ "mysql.user: 'root'" \ "mysql.pass: ''" \ "mysql.db: 'mysql'"

Если нету этого файла, то создаем его:

# touch /etc/salt/minion.d/mysql_salt.conf

Чтобы перезапустить salt-minion, стоит выполнить:

# salt 'de*' cmd.run "/etc/init.d/salt-minion restart"

Получаем:

debian.debian.home:
 Restarting salt minion control daemon: salt-minion.

Запускаемкоманду для установки mysql на ноду с debian:

# salt 'debian*' pkg.install mysql-server

Управление MySQL на minion-ах с Salt-master.

Чтобы создать базу данных на ноде, выполните:

# salt 'deb*' mysql.db_create 'test_db_name'

Можно вывести список всех баз:

# salt 'deb*' mysql.db_list

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

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

# salt '*' user.add test-salt-user

Вывод:

debian.debian.home:
 True
192.168.0.60:
 True

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

# salt '*' user.chfullname test-salt-user2 "My test second user"

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

# salt '*' user.chgroups test-salt-user games,ssh,mysql True

Запускаем другой вариант:

# salt '*' user.chgroups test-salt-user games True

Вывод:

debian.debian.home:
 True
192.168.0.60:
 True

Проверяем то получилось:

# salt '*' user.list_groups test-salt-user

Вывод:

debian.debian.home:
 - games
 - ssh
 - test-salt-user
192.168.0.60:
 - games
 - test-salt-user

Я рекомендую установить оболочку для пользователя:

# salt '*' user.chshell test-salt-user /bin/bash

Вывод:

192.168.0.60:
 True
debian.debian.home:
 True

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

# salt '*' shadow.set_password user02 '$1$jH24ZsgO$SRGy3SUSgGeoSCMFJk0TU/'

Вот два способа создать свой собственный пароль:

# python -c "import crypt, getpass, pwd; print crypt.crypt('123456', '\$6\$SALTsalt\$')"

# openssl passwd -1

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

# salt '*' user.delete test-salt-user remove=True force=True

Вывод:

debian.debian.home:
 True
192.168.0.60:
 True

А сейчас самое интересное. Команды-командами, но salt может не только это.

SALT STATE TREE

И так у вас есть небольшое представление о там как легко управлять простыми задачами на нескольких серверах одновременно. Удобно, не так ли? Я перехожу с простого к сложному.

Для того чтобы начать создавать свои кастомные модули, нужно немного видоизменить свой конфиг (если делали все как у меня в данной статье «Установка SALT Stack в Unix/Linux», то я вверху приводил готовый конфиг).

Чтобы посмотреть как и что прописано, выполните:

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

и для миньенов:

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

В качестве следующего шага мы создаем три state файла:

  • Создайте обязательно:
    /srv/salt/top.sls
  • Не обязательно:
    /srv/salt/motd.sls

Для этого нужно создать папку:

# mkdir -p /srv/salt

создадим пустые файлы:

# touch /srv/salt/top.sls 
# touch /srv/salt/motd.sls

Файл top.sls — является входящей точкой и определяется в /etc/salt/master. Это дает имя SaltStateFiles с расширением «*.sls». State файл содержит команды и директивы конфигурации. Можно использовать фильтры в серверных именах или других grains фильтрах в state дереве.

# cat /srv/salt/top.sls

base:
'*':
- motd

Вы можете управлять текстовым файлом:

# cat /srv/salt/motd.sls

Вывод:

motd_perms:
  file.managed:
    - name: /etc/motd
    - mode: 644

motd_quote:
  file.append:
    - name: /etc/motd
    - text: "Of all smells, bread; of all tastes, salt."

Мы можем активировать state дерево с помощью следующей команды:

# salt '*' state.highstate

Вы можете посмотреть StateTree запрос на Salt-Master с minion-а, так:

# salt-call state.highstate -l debug

Чтобы выключить все minion-ы, выполните команду:

# salt '*' cmd.run "poweroff"

Показать статус  для minion-ов.

Показать рабочие ноды:

# salt-run manage.up

Показать выключенные ноды:

# salt-run manage.down

Показать статус для нод:

# salt-run manage.status

На этому у меня все и я завершаю тему «Установка SALT Stack в Unix/Linux».

2 thoughts on “Установка SALT Stack в Unix/Linux

  1. Могу ли я создать каталоги/сборники (рецептов)
    А затем автоматизировать их применение на миньенах по какомуто его идентификатору? Просто когда миньен регистритуеться на сервером он автоматически получает рецепты и их применяет!
    Ну и разумеется при изменении или добавлении новых (рецептов) они применялись автоматически на всех миньенах.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.