Go to file
Долгий Артём f61cf84f12 mod 2024-03-29 14:43:58 +03:00
etc/salt mod 2024-03-29 13:02:27 +03:00
README.md mod 2024-03-29 14:43:58 +03:00
saltstack_tutorial_slides.pdf mod 2024-03-21 17:06:40 +03:00
stand.excalidraw mod 2024-03-25 14:20:10 +03:00
stand.png mod 2024-03-25 14:20:10 +03:00

README.md

Краткое руководство по Salt Stack



В качестве тестового стенда используется виртуальная лаборатория

stand

Краткая справка

Сравнение СУК

СУК Год создания Язык 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/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