| 
				
					
						 | 
			||
|---|---|---|
| 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
