2024-03-13 15:50:41 +03:00
# Краткое руководство по Salt Stack
2024-03-20 16:37:15 +03:00
***
- [Краткое руководство по Salt Stack ](#краткое-руководство-по-salt-stack )
2024-03-21 16:38:40 +03:00
- [Краткая справка ](#краткая-справка )
2024-03-21 16:48:45 +03:00
- [Сравнение С У К ](#сравнение-сук )
- [Аналогия с Ansible ](#аналогия-с -ansible )
2024-03-20 16:37:15 +03:00
- [Установка Salt ](#установка-salt )
2024-03-25 14:20:10 +03:00
- [Master на Debian 12 ](#master-на-debian-12 )
2024-03-20 16:37:15 +03:00
- [Minion на CentOS Stream 9 ](#minion-на-centos-stream-9 )
- [Minion на Debian 12 ](#minion-на-debian-12 )
- [Настройка master ](#настройка-master )
- [Настройка minion ](#настройка-minion )
- [Ключи ](#ключи )
2024-03-20 17:53:24 +03:00
- [Посмотреть все ключи ](#посмотреть-все-ключи )
- [Принять ключ конкретного миньона ](#принять-ключ-конкретного-миньона )
- [Принять ключи по маске идентификаторов ](#принять-ключи-по-маске-идентификаторов )
- [Показать только принятые ключи ](#показать-только-принятые-ключи )
- [Принять все предлагаемые ключи ](#принять-все-предлагаемые-ключи )
- [Удалить ключи по маске ](#удалить-ключи-по-маске )
- [Удалить конкретный ключ ](#удалить-конкретный-ключ )
- [Удалить все ключи ](#удалить-все-ключи )
2024-03-25 14:20:10 +03:00
- [Переинициализация миньона ](#переинициализация-миньона )
2024-03-20 16:37:15 +03:00
- [Первый тест ](#первый-тест )
2024-03-20 17:53:24 +03:00
- [С б о р данных ](#с б о р -данных )
- [С б о р всех данных ](#с б о р -всех-данных )
- [Получение конкретных значений ](#получение-конкретных-значений )
- [Указание конкретных миньонов для запуска ](#указание-конкретных-миньонов-для-запуска )
- [По маске имён ](#по-маске-имён )
- [По зёрнам (`grains`) в качестве фильтров ](#по-зёрнам-grains-в-качестве-фильтров )
- [По группам узлов ](#по-группам-узлов )
- [Составные подстановки ](#составные-подстановки )
2024-03-21 14:04:29 +03:00
- [Модули исполнения ](#модули-исполнения )
2024-03-21 14:48:05 +03:00
- [Несколько полезных функций ](#несколько-полезных-функций )
- [Формулы ](#формулы )
2024-03-20 16:37:15 +03:00
- [Источники ](#источники )
***
2024-03-13 15:50:41 +03:00
В качестве тестового стенда используется виртуальная лаборатория
2024-03-13 15:53:40 +03:00

2024-03-13 15:50:41 +03:00
2024-03-21 16:38:40 +03:00
## Краткая справка
2024-03-21 16:48:45 +03:00
### Сравнение С У К
2024-03-21 16:38:40 +03:00
| С У К | Год создания | Язык | DSL | Особенности |
| --------- | :----------: | ------------ | ---- | -------------------------- |
2024-03-21 16:48:45 +03:00
| 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
2024-03-21 16:51:06 +03:00
| Значение | В SaltStack | В Ansible |
| ------------------------------------ | ----------- | ---------------------- |
| Сервер | Мастер | Узел (нода) управления |
| Клиент | Миньон | Управляемый узел |
| Декларативный конфиг клиента | Формула | Плейбук |
| Элементарная единица конфига клиента | Состояние | Таск |
| Переменная клиента | Грейн | Факт |
| Описание узлов | Топ-файл | Инвентарь (узлы) |
| Переменные | Пиллары | Переменные |
2024-03-21 16:38:40 +03:00
2024-03-20 14:06:12 +03:00
## Установка Salt
процесс установки описан в документации < https: / / docs . saltproject . io / salt / install-guide / en / latest / index . html >
2024-03-25 14:20:10 +03:00
### Master на Debian 12
2024-03-25 14:21:00 +03:00
_с на ча ла установил на Альт сервер, потом оказалось, что Salt не поддерживает работу с пакетным менеджером apt-rpm, который используется в Альте. Чтобы не усложнять жизнь на этапе освоения Salt, от использования в стенде узлов с О С Альт отказался._
2024-03-20 14:06:12 +03:00
```bash
2024-03-25 14:20:10 +03:00
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
2024-03-20 14:06:12 +03:00
systemctl enable --now salt-master
systemctl enable --now salt-minion
2024-03-25 14:20:10 +03:00
systemctl enable --now salt-syndic
systemctl enable --now salt-api
2024-03-20 14:06:12 +03:00
```
2024-03-21 08:40:33 +03:00
[вверх ](#краткое-руководство-по-salt-stack )
2024-03-20 14:06:12 +03:00
### Minion на CentOS Stream 9
```bash
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
```bash
su -
2024-03-25 14:20:10 +03:00
apt update
apt install curl
2024-03-20 14:06:12 +03:00
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
2024-03-25 14:20:10 +03:00
apt update & & apt install -y salt-minion
2024-03-20 14:06:12 +03:00
systemctl enable --now salt-minion
```
2024-03-21 08:40:33 +03:00
[вверх ](#краткое-руководство-по-salt-stack )
2024-03-20 14:06:12 +03:00
## Настройка master
Описание возможных директив конфигурационного файла приводится в файле `/etc/salt/master` или в документации < https: // docs . saltproject . io / en / latest / ref / configuration / master . html >
Хорошим тоном является создание своих конфигурационных файлов в директории `*.d`
```bash
vim /etc/salt/master.d/master.conf
```
```bash
# 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
2024-03-25 15:57:49 +03:00
# Директории, где лежат файлы состояний и пр.
file_roots:
base: # Это дефолтный saltenv
- /srv/salt/ # Это дефолтный путь
dev:
- /srv/salt-dev/
prod:
- /srv/salt-prod/
2024-03-20 17:53:24 +03:00
# Объединение узлов в группы
# Пробелы в выборках нужно обрабатывать
# Н Е правильно - 'G@os:CentOS Strem'
2024-03-25 15:57:49 +03:00
# Правильно - 'G@os:CentOS?Stream' или 'P@os:CentOS\sStream'
2024-03-20 17:53:24 +03:00
nodegroups:
2024-03-25 15:57:49 +03:00
alt: 'G@os:ALT'
2024-03-20 17:53:24 +03:00
centos-stream: 'G@os:CentOS?Stream'
centos: 'P@os:CentOS\sStream'
debian: 'G@os:Debian'
apt: 'deb-*'
rpm: 'centos-*'
2024-03-20 14:06:12 +03:00
```
2024-03-21 08:40:33 +03:00
[вверх ](#краткое-руководство-по-salt-stack )
2024-03-20 14:06:12 +03:00
## Настройка minion
< https: / / docs . saltproject . io / en / latest / ref / configuration / minion . html >
```bash
cat /etc/salt/minion.d/minion.conf
```
```bash
# Адрес мастера
master: 10.1.4.1
# Уникальный идентификатор миньона
2024-03-20 15:01:17 +03:00
# по-умолчанию берётся hostname
2024-03-20 14:06:12 +03:00
id: centos-minion-1
```
2024-03-20 15:01:17 +03:00
## Ключи
2024-03-20 14:06:12 +03:00
2024-03-20 15:01:17 +03:00
Для аутентификации и авторизации в Salt используются пары ключей (закрытый, открытый). При включении службы миньона формируется пара ключей, открытый ключ отправляется на мастер.
2024-03-20 14:06:12 +03:00
2024-03-20 15:01:17 +03:00
У мастера есть специальная утилита для работы с ключами - `salt-key`
Некоторые примеры работы с ней:
2024-03-20 17:53:24 +03:00
### Посмотреть все ключи
2024-03-20 15:01:17 +03:00
```bash
[root@alt-master ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
alt-minion-5
alt-minion-6
centos-minion-1
centos-minion-2
deb-minion-3
deb-minion-4
Rejected Keys:
```
2024-03-21 08:40:33 +03:00
[вверх ](#краткое-руководство-по-salt-stack )
2024-03-20 17:53:24 +03:00
### Принять ключ конкретного миньона
2024-03-20 15:01:17 +03:00
```bash
[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.
```
2024-03-20 17:53:24 +03:00
### Принять ключи по маске идентификаторов
2024-03-20 15:01:17 +03:00
```bash
[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.
```
2024-03-20 17:53:24 +03:00
### Показать только принятые ключи
2024-03-20 15:01:17 +03:00
```bash
salt-key -l accepted
```
2024-03-20 17:53:24 +03:00
### Принять все предлагаемые ключи
2024-03-20 15:01:17 +03:00
```bash
salt-key -A
```
2024-03-20 17:53:24 +03:00
### Удалить ключи по маске
2024-03-20 15:01:17 +03:00
```bash
salt-key -d 'deb*'
```
2024-03-20 17:53:24 +03:00
### Удалить конкретный ключ
2024-03-20 15:01:17 +03:00
```bash
salt-key -d deb-minion-3
```
2024-03-20 17:53:24 +03:00
### Удалить все ключи
2024-03-20 15:01:17 +03:00
```bash
salt-key -D
```
2024-03-20 15:17:23 +03:00
Для дальнейшей работы необходимо принять ключи миньонов *(уверены в том, что в текущем окружении только проверенные узлы)*
2024-03-20 15:01:17 +03:00
```bash
[root@alt-master ~]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
alt-minion-5
alt-minion-6
centos-minion-2
Proceed? [n/Y]
Key for minion alt-minion-5 accepted.
Key for minion alt-minion-6 accepted.
Key for minion centos-minion-2 accepted.
```
Таким образом должен получиться такой вывод
```bash
[root@alt-master ~]# salt-key -L
Accepted Keys:
alt-minion-5
alt-minion-6
centos-minion-1
centos-minion-2
deb-minion-3
deb-minion-4
Denied Keys:
Unaccepted Keys:
Rejected Keys:
```
2024-03-21 08:40:33 +03:00
[вверх ](#краткое-руководство-по-salt-stack )
2024-03-25 14:20:10 +03:00
### Переинициализация миньона
Н а мастере удалить ключ миньона, затем на миньоне
```bash
systemctl stop salt-minion.service
rm -rf /etc/salt/pki/
systemctl start salt-minion.service
```
далее на мастере принять обновлённый ключ
2024-03-20 15:01:17 +03:00
## Первый тест
```bash
[root@alt-master ~]# salt '*' test.ping
centos-minion-2:
True
deb-minion-3:
True
deb-minion-4:
True
centos-minion-1:
True
alt-minion-6:
True
alt-minion-5:
True
-------------------------------------------
Summary
-------------------------------------------
# of minions targeted: 6
# of minions returned: 6
# of minions that did not return: 0
# of minions with errors: 0
-------------------------------------------
```
2024-03-20 14:06:12 +03:00
2024-03-20 17:53:24 +03:00
## С б о р данных
grains - зёрна, переменные, которые получает мастер с миньона
```bash
[root@alt-master ~]# salt 'alt-minion-6' 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 покажет возможные варианты команды
### С б о р всех данных
```bash
salt 'alt-minion-6' grains.items
```
### Получение конкретных значений
```bash
salt 'alt-minion-6' grains.item ipv4
```
```bash
salt 'alt-minion-6' grains.item os
```
```bash
salt 'alt-minion-6' grains.item cpuarch
```
2024-03-21 08:40:33 +03:00
[вверх ](#краткое-руководство-по-salt-stack )
2024-03-20 17:53:24 +03:00
## Указание конкретных миньонов для запуска
### По маске имён
```bash
salt 'deb-*' test.ping
```
`*` - и прочие подстановочные символы необходимо оборачивать кавычками, иначе оболочка их будет интерпретировать по-своему - Glob-подстановки
### По зёрнам (`grains`) в качестве фильтров
```bash
salt -G 'os:ALT' test.ping
```
```bash
2024-03-21 14:04:29 +03:00
salt -G 'os:CentOS Stream' test.ping
2024-03-20 17:53:24 +03:00
```
### По группам узлов
Группы узлов необходимо заранее создать в настройках мастера
```bash
salt -N debian test.ping
```
### Составные подстановки
2024-03-21 14:04:29 +03:00
В составных выборках необходимо обрабатывать пробелы, т.к. не ясно где заканчивается условие, а где составное имя
2024-03-25 14:20:10 +03:00
**Н Е правильно** - `'G@os:CentOS Stream'`
2024-03-21 14:04:29 +03:00
**Правильно** - `'G@os:CentOS?Stream'`
**Правильно** - `'P@os:CentOS\sStream'`
**Правильно** - `G@os:CentOS*`
2024-03-20 17:53:24 +03:00
```bash
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
```
2024-03-21 08:40:33 +03:00
[вверх ](#краткое-руководство-по-salt-stack )
2024-03-21 14:04:29 +03:00
## Модули исполнения
Несколько стандартных модулей
- `test` , `saltutils` - служебные модули для тестирования и диагностики
- `file` , `package` , `service` , `system` , `cmd` - назначение понятно из названия, работа с файлами, пакетами, службами systemd и пр.
- `apache` , `postgres` , `nginx` , `redis` - модули для работы с одноимёнными системами
- `ansiblegate` , `chef` , `puppet` - шлюзы для соединения с другими системами управления состоянием
Двойной Tab позволяет получить сведения о возможных командах в каждом модуле
```bash
[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
```
2024-03-21 08:40:33 +03:00
2024-03-21 14:48:05 +03:00
### Несколько полезных функций
- `test.ping` - доступность миньона
- `saltutil.sync_all` - синхронизация всех сущностей, которые имеются на мастере
- `sys.doc` - получение справки о модуле
- `state.test` - проверка возможности исполнения без непосредственного исполнения, алиас для `state.apply test=True`
2024-03-25 16:26:31 +03:00
[вверх ](#краткое-руководство-по-salt-stack )
2024-03-21 14:48:05 +03:00
## Формулы
2024-03-25 14:20:10 +03:00
`top.sls` - файл с описанием целевого состояния миньонов. В текущем стенде он находится по пути `/srv/salt` , этот путь обозначен в настройке мастера в директиве `file_roots`
```yml
---
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`
```yml
---
# Пример установки пакетов на разные миньоны
{% set vim = 'vim' %}
{% if grains['os'] == 'CentOS Stream' %}
{% set vim = 'vim-enhanced' %}
{% endif %}
common_pkgs_installed:
pkg.installed:
- pkgs:
- {{ vim }}
- git
- mc
- refresh: true
```
Для применения состояния необходимо е г о выполнить:
2024-03-21 14:48:05 +03:00
2024-03-25 14:20:10 +03:00
- протестировать состояние перед применением - `salt '*' state.test`
- вручную - `salt '*' state.apply`
- автоматически. В настройках миньона необходимо прописать состояние по-умолчанию или создать на мастере реактор, который будет отслеживать состояние миньонов
2024-03-21 08:40:33 +03:00
[вверх ](#краткое-руководство-по-salt-stack )
2024-03-20 14:06:12 +03:00
## Источники
< https: / / www . youtube . com / watch ? v = 6zY41M2anrY > < / br >
2024-03-20 15:17:48 +03:00
< https: / / gitlab . com / bergentroll-docs / saltstack-tutorial > < / br >
< https: / / docs . saltproject . io / en / latest / contents . html > < / br >
2024-03-20 15:17:23 +03:00