|
||
---|---|---|
etc/salt | ||
README.md | ||
saltstack_tutorial_slides.pdf | ||
stand.excalidraw | ||
stand.png |
README.md
Краткое руководство по Salt Stack
- Краткое руководство по Salt Stack
В качестве тестового стенда используется виртуальная лаборатория
Краткая справка
Сравнение СУК
СУК | Год создания | Язык | DSL | Особенности |
---|---|---|---|---|
Puppet | 2005 | Ruby | Свой | Pull |
Chef | 2009 | Ruby, Erlang | Ruby | Pull, Web |
SaltStack | 2011 | Python | YAML | Pull (Push), корп-версия |
Ansible | 2012 | Python | YAML | Push (Pull), Ansible Tower |
Аналогия с Ansible
Значение | В SaltStack | В Ansible |
---|---|---|
Сервер | Мастер | Узел (нода) управления |
Клиент | Миньон | Управляемый узел |
Декларативный конфиг клиента | Формула | Плейбук |
Элементарная единица конфига клиента | Состояние | Таск |
Переменная клиента | Грейн | Факт |
Описание узлов | Топ-файл | Инвентарь (узлы) |
Переменные | Пиллары | Переменные |
Установка Salt
процесс установки описан в документации https://docs.saltproject.io/salt/install-guide/en/latest/index.html
Master на Debian 12
сначала установил на Альт сервер, потом оказалось, что Salt не поддерживает работу с пакетным менеджером apt-rpm, который используется в Альте. Чтобы не усложнять жизнь на этапе освоения Salt, от использования в стенде узлов с ОС Альт отказался.
su -
apt update
apt install curl
mkdir /etc/apt/keyrings
curl -fsSL -o /etc/apt/keyrings/salt-archive-keyring-2023.gpg https://repo.saltproject.io/salt/py3/debian/12/amd64/SALT-PROJECT-GPG-PUBKEY-2023.gpg
echo "deb [signed-by=/etc/apt/keyrings/salt-archive-keyring-2023.gpg arch=amd64] https://repo.saltproject.io/salt/py3/debian/12/amd64/latest bookworm main" | tee /etc/apt/sources.list.d/salt.list
apt update
apt install salt-master salt-minion salt-ssh salt-syndic salt-cloud salt-api
systemctl enable --now salt-master
systemctl enable --now salt-minion
systemctl enable --now salt-syndic
systemctl enable --now salt-api
Minion на CentOS Stream 9
sudo rpm --import https://repo.saltproject.io/salt/py3/redhat/9/x86_64/SALT-PROJECT-GPG-PUBKEY-2023.pub
curl -fsSL https://repo.saltproject.io/salt/py3/redhat/9/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo
sudo dnf install -y salt-minion
sudo systemctl enable --now salt-minion
Minion на Debian 12
su -
apt update
apt install curl
mkdir /etc/apt/keyrings
curl -fsSL -o /etc/apt/keyrings/salt-archive-keyring-2023.gpg https://repo.saltproject.io/salt/py3/debian/12/amd64/SALT-PROJECT-GPG-PUBKEY-2023.gpg
echo "deb [signed-by=/etc/apt/keyrings/salt-archive-keyring-2023.gpg arch=amd64] https://repo.saltproject.io/salt/py3/debian/12/amd64/latest bookworm main" | tee /etc/apt/sources.list.d/salt.list
apt update && apt install -y salt-minion
systemctl enable --now salt-minion
Автодополнение команд
В Альт автодополнение работает из коробки, а вот в Debian его необходимо дополнительно настраивать.
В первую очередь необходимо убедиться в том, что установлен пакет bash-completion
root@deb-master:~# apt-cache policy bash-completion
bash-completion:
Установлен: 1:2.11-6
Кандидат: 1:2.11-6
Таблица версий:
*** 1:2.11-6 500
500 http://deb.debian.org/debian bookworm/main amd64 Packages
100 /var/lib/dpkg/status
если не установлен - установить. Это добавит автодополнение для встроенных команд bash, для того, чтобы заработало автодополнение в salt, дополнительно необходимо добавить профиль автодополнения
wget https://raw.githubusercontent.com/saltstack/salt/develop/pkg/salt.bash
cp salt.bash /etc/bash_completion.d/
source /etc/bash_completion.d/salt.bash
Теперь по двойному Tab в командах salt на мастере должны отображаться возможные варианты дополнения команд.
Настройка master
Описание возможных директив конфигурационного файла приводится в файле /etc/salt/master
или в документации https://docs.saltproject.io/en/latest/ref/configuration/master.html
Хорошим тоном является создание своих конфигурационных файлов в директории *.d
vim /etc/salt/master.d/master.conf
# The network interface to bind to
interface: 0.0.0.0
# The Request/Reply port
# Для файлового сервера, аутентификации, возврата результатов и проч.
ret_port: 4506
# The port minions bind to for commands, aka the publish port
publish_port: 4505
# Писать статистику после выполнения команд
cli_summary: true
# Директории, где лежат файлы состояний и пр.
file_roots:
base: # Это дефолтный saltenv
- /srv/salt/ # Это дефолтный путь
dev:
- /srv/salt-dev/
prod:
- /srv/salt-prod/
# Объединение узлов в группы
# Пробелы в выборках нужно обрабатывать
# НЕ правильно - 'G@os:CentOS Strem'
# Правильно - 'G@os:CentOS?Stream' или 'P@os:CentOS\sStream'
nodegroups:
alt: 'G@os:ALT'
centos-stream: 'G@os:CentOS?Stream'
centos: 'P@os:CentOS\sStream'
debian: 'G@os:Debian'
apt: 'deb-*'
rpm: 'centos-*'
Настройка minion
https://docs.saltproject.io/en/latest/ref/configuration/minion.html
cat /etc/salt/minion.d/minion.conf
# Адрес мастера
master: 10.1.4.1
# Уникальный идентификатор миньона
# по-умолчанию берётся hostname
id: centos-minion-1
Ключи
Для аутентификации и авторизации в Salt используются пары ключей (закрытый, открытый). При включении службы миньона формируется пара ключей, открытый ключ отправляется на мастер.
У мастера есть специальная утилита для работы с ключами - salt-key
Некоторые примеры работы с ней:
Посмотреть все ключи
[root@alt-master ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
centos-minion-1
centos-minion-2
deb-minion-3
deb-minion-4
Rejected Keys:
Принять ключ конкретного миньона
[root@alt-master ~]# salt-key -l accepted
Accepted Keys:
[root@alt-master ~]# salt-key -a centos-minion-1
The following keys are going to be accepted:
Unaccepted Keys:
centos-minion-1
Proceed? [n/Y]
Key for minion centos-minion-1 accepted.
Принять ключи по маске идентификаторов
[root@alt-master ~]# salt-key -a 'deb*'
The following keys are going to be accepted:
Unaccepted Keys:
deb-minion-3
deb-minion-4
Proceed? [n/Y]
Key for minion deb-minion-3 accepted.
Key for minion deb-minion-4 accepted.
Показать только принятые ключи
salt-key -l accepted
Принять все предлагаемые ключи
salt-key -A
Удалить ключи по маске
salt-key -d 'deb*'
Удалить конкретный ключ
salt-key -d deb-minion-3
Удалить все ключи
salt-key -D
Для дальнейшей работы необходимо принять ключи миньонов (уверены в том, что в текущем окружении только проверенные узлы)
[root@alt-master ~]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
centos-minion-2
Proceed? [n/Y]
Key for minion centos-minion-2 accepted.
Таким образом должен получиться такой вывод
[root@alt-master ~]# salt-key -L
Accepted Keys:
centos-minion-1
centos-minion-2
deb-minion-3
deb-minion-4
Denied Keys:
Unaccepted Keys:
Rejected Keys:
Переинициализация миньона
На мастере удалить ключ миньона, затем на миньоне
systemctl stop salt-minion.service
rm -rf /etc/salt/pki/
systemctl start salt-minion.service
далее на мастере принять обновлённый ключ
Первый тест
root@deb-master:~# salt '*' test.ping
deb-minion-4:
True
centos-minion-2:
True
deb-master:
True
deb-minion-3:
True
centos-minion-1:
True
-------------------------------------------
Summary
-------------------------------------------
# of minions targeted: 5
# of minions returned: 5
# of minions that did not return: 0
# of minions with errors: 0
-------------------------------------------
Сбор данных
grains - зёрна, переменные, которые получает мастер с миньона
[root@alt-master ~]# salt 'deb-minion-4' grains.
grains.append grains.delval grains.fetch grains.get grains.item grains.ls grains.set grains.setvals
grains.delkey grains.equals grains.filter_by grains.has_value grains.items grains.remove grains.setval
двойной Tab покажет возможные варианты команды
Сбор всех данных
salt 'deb-minion-4' grains.items
Получение конкретных значений
salt 'deb-minion-4' grains.item ipv4
salt 'deb-minion-4' grains.item os
salt 'deb-minion-4' grains.item cpuarch
Указание конкретных миньонов для запуска
По маске имён
salt 'deb-*' test.ping
*
- и прочие подстановочные символы необходимо оборачивать кавычками, иначе оболочка их будет интерпретировать по-своему - Glob-подстановки
По зёрнам (grains
) в качестве фильтров
salt -G 'os:ALT' test.ping
salt -G 'os:CentOS Stream' test.ping
По группам узлов
Группы узлов необходимо заранее создать в настройках мастера
salt -N debian test.ping
Составные подстановки
В составных выборках необходимо обрабатывать пробелы, т.к. не ясно где заканчивается условие, а где составное имя
НЕ правильно - 'G@os:CentOS Stream'
Правильно - 'G@os:CentOS?Stream'
Правильно - 'P@os:CentOS\sStream'
Правильно - G@os:CentOS*
deb_ip=$(salt 'deb-minion-3' network.ipaddrs --out=newline_values_only)
salt -C "( G@os:CentOS* and alt* ) or S@${deb_ip}" test.ping
Модули исполнения
Несколько стандартных модулей
test
,saltutils
- служебные модули для тестирования и диагностикиfile
,package
,service
,system
,cmd
- назначение понятно из названия, работа с файлами, пакетами, службами systemd и пр.apache
,postgres
,nginx
,redis
- модули для работы с одноимёнными системамиansiblegate
,chef
,puppet
- шлюзы для соединения с другими системами управления состоянием
Двойной Tab позволяет получить сведения о возможных командах в каждом модуле
[root@alt-master ~]# salt -G 'os:CentOS Stream' test.
test.arg test.conf_test test.get_opts test.provider test.sleep test.versions_information
test.arg_clean test.cross_test test.kwarg test.providers test.stack test.versions_report
test.arg_repr test.deprecation_warning test.module_report test.raise_exception test.true
test.arg_type test.echo test.not_loaded test.random_hash test.try
test.assertion test.exception test.opts_pkg test.rand_sleep test.tty
test.attr_call test.false test.outputter test.rand_str test.version
test.collatz test.fib test.ping test.retcode test.versions
[root@alt-master ~]#
[root@alt-master ~]#
[root@alt-master ~]# salt -G 'os:CentOS Stream' file.
file.access file.directory_exists file.group_to_gid file.mknod_blkdev file.rmdir
file.append file.dirname file.is_blkdev file.mknod_chrdev file.search
file.apply_template_on_contents file.diskusage file.is_chrdev file.mknod_fifo file.sed
file.basename file.extract_hash file.is_fifo file.move file.sed_contains
file.blockreplace file.file_exists file.is_hardlink file.normpath file.seek_read
file.chattr file.find file.is_link file.open_files file.seek_write
file.check_file_meta file.get_devmm file.join file.pardir file.set_mode
file.check_hash file.get_diff file.lchown file.patch file.set_selinux_context
file.check_managed file.get_gid file.line file.path_exists_glob file.source_list
file.check_managed_changes file.get_group file.link file.prepend file.stats
file.check_perms file.get_hash file.list_backup file.psed file.statvfs
file.chgrp file.get_managed file.list_backups file.read file.symlink
file.chown file.get_mode file.list_backups_dir file.readdir file.touch
file.comment file.get_selinux_context file.lsattr file.readlink file.truncate
file.comment_line file.get_source_sum file.lstat file.remove file.uid_to_user
file.contains file.get_sum file.makedirs file.remove_backup file.uncomment
file.contains_glob file.get_uid file.makedirs_perms file.rename file.user_to_uid
file.contains_regex file.get_user file.manage_file file.replace file.write
file.copy file.gid_to_group file.mkdir file.restore_backup
file.delete_backup file.grep file.mknod file.restorecon
Несколько полезных функций
test.ping
- доступность миньонаsaltutil.sync_all
- синхронизация всех сущностей, которые имеются на мастереsys.doc
- получение справки о модулеstate.test
- проверка возможности исполнения без непосредственного исполнения, алиас дляstate.apply test=True
Формулы
top.sls
- файл с описанием целевого состояния миньонов. В текущем стенде он находится по пути /srv/salt
, этот путь обозначен в настройке мастера в директиве file_roots
---
base:
'*':
- highstate.common_pkgs_installed
'N@apt':
- highstate.apt
'N@rpm':
- highstate.rpm
prod: {}
dev: {}
highstate.common_pkgs_installed
- путь к файлу состояния. Разделитель директории указан в виде .
точки, а не /
.
Таким образом полный путь к файлу состояния выглядит так - /srv/salt/highstate/common_pkgs_installed.sls
common_pkgs_installed.sls
---
# Пример установки пакетов на разные миньоны
{% set vim = 'vim' %}
{% if grains['os'] == 'CentOS Stream' %}
{% set vim = 'vim-enhanced' %}
{% endif %}
common_pkgs_installed:
pkg.installed:
- pkgs:
- {{ vim }}
- git
- mc
- refresh: true
Для применения состояния необходимо его выполнить:
- протестировать состояние перед применением -
salt '*' state.test
- вручную -
salt '*' state.apply
- автоматически. В настройках миньона необходимо прописать состояние по-умолчанию или создать на мастере реактор, который будет отслеживать состояние миньонов
Модули состояний
Модули состояний похожи на модули исполнения с той разницей, что модули исполнения используются для текущего выполнения в командной строке, а модули состояний описываются в формулах, которые должны применяться на миньонах. Чаще функционал модулей исполнения и модулей состояний идентичен, но в некоторых модулях могут быть отличия.
---
# Пример системного состояния для RPM-дистрибутивов.
# Обновляет ядро Linux и корректирует конфигурацию загрузчика.
kernel updated:
pkg.uptodate:
- pkgs:
- kernel
- refresh: true
file.comment:
- name: '/etc/default/grub'
- regex: '^GRUB_DEFAULT|^GRUB_DISABLE_SUBMENU'
cmd.run:
- name: 'grub2-mkconfig -o /boot/grub2/grub.cfg'
module.run:
- name: system.reboot
В примере указаны модули состояний pkg
, file
, cmd
каждый вызывается с конкретной функцией - pkg.uptodate
, file.comment
, cmd.run
Модуль module.run
- позволяет в файле описания состояний вызвать модуль исполнения. Так в примере с помощью этого модуля вызван модуль исполнения system.reboot
Нельзя использовать в одном состоянии один модуль несколько раз!
Например такое состояние завершится ошибкой потому что модуль pkg
используется дважды
---
common_pkgs_installed:
pkg.installed:
- pkgs:
- git
- mc
- refresh: true
pkg.latest:
- name: mc
deb-master:
Data failed to compile:
----------
ID 'common_pkgs_installed' in SLS 'highstate.common_pkgs_installed' contains multiple state declarations of the same type
Порядок исполнения
- по порядку описания
---
state1:
test.succeed_with_changes
state2:
test.succeed_with_changes
state3:
test.succeed_with_changes
state4:
test.succeed_with_changes
- по флагу
ordered
---
state1:
test.succeed_with_changes:
- order: 3
state2:
test.succeed_with_changes:
- order: 2
state3:
test.succeed_with_changes:
- order: 1
state4:
test.succeed_with_changes:
- order: 4
Выполнится в порядке order - order: 1
, order: 2
, order: 3
, order: 4
- по реквизитам
---
state1:
test.succeed_with_changes: []
state2:
test.succeed_with_changes:
- require:
- state1
state3:
test.succeed_with_changes:
- onchanges: # А так же watch, listen
- state1
- test: state2
state4:
test.succeed_with_changes:
- prereq:
- state1
unhappy_state:
test.succeed_with_changes:
- onfail:
- state*
Реактор
Используется для применения состояния по событиям. Реактор необходимо настроить в конфигурационном файле мастера в соответствующей секции.
reactor:
- salt/auth: # тэг, произвольное значение
- salt://reactor/highstate.sls # действие, которое применяется при включении миньона
далее по пути /srv/salt/reactor/
создаём файл highstate.sls
---
# Это local-реактор
run_highstate:
local.state.apply:
- tgt: '*'
tgt
- target, миньоны, на которые распространяется таргет
теперь для всех авторизованных миньонов при подключении их к мастеру автоматически будет применяться описанное в конфигурации состояние.
Подробнее в документации:
- https://docs.saltproject.io/en/latest/topics/reactor/index.html
- https://docs.saltproject.io/salt/user-guide/en/latest/topics/reactors.html
Расписание
Может быть настроено на мастере или миньоне. Могут запускаться модули и применяться состояния.
Описано в документации https://docs.saltproject.io/salt/user-guide/en/latest/topics/scheduler.html
Источники
https://www.youtube.com/watch?v=6zY41M2anrY
https://gitlab.com/bergentroll-docs/saltstack-tutorial
https://docs.saltproject.io/salt/user-guide/en/latest/index.html
https://docs.saltproject.io/en/latest/contents.html