
Установка SALT Stack в Unix/Linux
Что такое Salt Stack?
Salt является новый подходом к управлению инфраструктурой. Его легко использовать чтобы за считанные минуты, развернуть его и начать управлять десятками тысяч серверов. В своей статье «Установка SALT Stack в Unix/Linux» я расскажу как можно установить SALT Stack в Unix/Linux, на готовом примере. В более подробной форме, я расскажу как и что нужно выполнять чтобы изучить данную тему. Для меня, эта тема — новая и я с ней сталкиваюсь первый раз.
Почему именно Salt Stack?
- Простота установки (мастера и миньенов).
- Простота настройки.
- Простота использования.
Предпосылки
И так, у меня имеется следующие ресурсы:
- Сервер на операционной системе CentOS 6.7 — будет использоваться для salt-master (сервера salt).
- Сервер на операционной системе 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'
В данном конфиге, нужно не сильно многое менять, по этому, я не буду сильно уделять время на это. Если нужно, вот готовый, рабочий конфиг:
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'
В данном конфиге, нужно не сильно многое менять, по этому, я не буду сильно уделять время на это. Если нужно, вот готовый, рабочий конфиг:
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».
Огромное спасибо за статью!
Могу ли я создать каталоги/сборники (рецептов)
А затем автоматизировать их применение на миньенах по какомуто его идентификатору? Просто когда миньен регистритуеться на сервером он автоматически получает рецепты и их применяет!
Ну и разумеется при изменении или добавлении новых (рецептов) они применялись автоматически на всех миньенах.