# Краткое руководство по Salt Stack *** - [Краткое руководство по Salt Stack](#краткое-руководство-по-salt-stack) - [Краткая справка](#краткая-справка) - [Сравнение СУК](#сравнение-сук) - [Аналогия с Ansible](#аналогия-с-ansible) - [Установка Salt](#установка-salt) - [Master на Альт сервер](#master-на-альт-сервер) - [Minion на CentOS Stream 9](#minion-на-centos-stream-9) - [Minion на Debian 12](#minion-на-debian-12) - [Minion на Альт Сервер 10.2](#minion-на-альт-сервер-102) - [Настройка master](#настройка-master) - [Настройка minion](#настройка-minion) - [Ключи](#ключи) - [Посмотреть все ключи](#посмотреть-все-ключи) - [Принять ключ конкретного миньона](#принять-ключ-конкретного-миньона) - [Принять ключи по маске идентификаторов](#принять-ключи-по-маске-идентификаторов) - [Показать только принятые ключи](#показать-только-принятые-ключи) - [Принять все предлагаемые ключи](#принять-все-предлагаемые-ключи) - [Удалить ключи по маске](#удалить-ключи-по-маске) - [Удалить конкретный ключ](#удалить-конкретный-ключ) - [Удалить все ключи](#удалить-все-ключи) - [Первый тест](#первый-тест) - [Сбор данных](#сбор-данных) - [Сбор всех данных](#сбор-всех-данных) - [Получение конкретных значений](#получение-конкретных-значений) - [Указание конкретных миньонов для запуска](#указание-конкретных-миньонов-для-запуска) - [По маске имён](#по-маске-имён) - [По зёрнам (`grains`) в качестве фильтров](#по-зёрнам-grains-в-качестве-фильтров) - [По группам узлов](#по-группам-узлов) - [Составные подстановки](#составные-подстановки) - [Модули исполнения](#модули-исполнения) - [Несколько полезных функций](#несколько-полезных-функций) - [Формулы](#формулы) - [Источники](#источники) *** В качестве тестового стенда используется виртуальная лаборатория ![stand](./stand.png) ## Краткая справка ### Сравнение СУК | СУК | Год создания | Язык | 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 процесс установки описан в документации ### Master на Альт сервер ```bash apt-get update && apt-get install -y salt-master salt-minion salt-api systemctl enable --now salt-master systemctl enable --now salt-minion ``` [вверх](#краткое-руководство-по-salt-stack) ### 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 - 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 ``` [вверх](#краткое-руководство-по-salt-stack) ### Minion на Альт Сервер 10.2 ```bash su - apt-get update apt-get install -y salt-minion systemctl enable --now salt-minion ``` ## Настройка master Описание возможных директив конфигурационного файла приводится в файле `/etc/salt/master` или в документации Хорошим тоном является создание своих конфигурационных файлов в директории `*.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 # Объединение узлов в группы # Пробелы в выборках нужно обрабатывать # НЕ правильно - 'G@os:CentOS Strem' # Правильно - 'G@os:CentOS?Stream' или 'P@os:CentOS\sStream' или 'G@os:CentOS*' nodegroups: alt: 'G@os:ALT' centos-stream: 'G@os:CentOS?Stream' centos: 'P@os:CentOS\sStream' debian: 'G@os:Debian' apt: 'deb-*' rpm: 'centos-*' worker_threads: 5 ``` [вверх](#краткое-руководство-по-salt-stack) ## Настройка minion ```bash cat /etc/salt/minion.d/minion.conf ``` ```bash # Адрес мастера master: 10.1.4.1 # Уникальный идентификатор миньона # по-умолчанию берётся hostname id: centos-minion-1 ``` ## Ключи Для аутентификации и авторизации в Salt используются пары ключей (закрытый, открытый). При включении службы миньона формируется пара ключей, открытый ключ отправляется на мастер. У мастера есть специальная утилита для работы с ключами - `salt-key` Некоторые примеры работы с ней: ### Посмотреть все ключи ```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: ``` [вверх](#краткое-руководство-по-salt-stack) ### Принять ключ конкретного миньона ```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. ``` ### Принять ключи по маске идентификаторов ```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. ``` ### Показать только принятые ключи ```bash salt-key -l accepted ``` ### Принять все предлагаемые ключи ```bash salt-key -A ``` ### Удалить ключи по маске ```bash salt-key -d 'deb*' ``` ### Удалить конкретный ключ ```bash salt-key -d deb-minion-3 ``` ### Удалить все ключи ```bash salt-key -D ``` Для дальнейшей работы необходимо принять ключи миньонов *(уверены в том, что в текущем окружении только проверенные узлы)* ```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: ``` [вверх](#краткое-руководство-по-salt-stack) ## Первый тест ```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 ------------------------------------------- ``` ## Сбор данных 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 ``` [вверх](#краткое-руководство-по-salt-stack) ## Указание конкретных миньонов для запуска ### По маске имён ```bash salt 'deb-*' test.ping ``` `*` - и прочие подстановочные символы необходимо оборачивать кавычками, иначе оболочка их будет интерпретировать по-своему - Glob-подстановки ### По зёрнам (`grains`) в качестве фильтров ```bash salt -G 'os:ALT' test.ping ``` ```bash salt -G 'os:CentOS Stream' test.ping ``` ### По группам узлов Группы узлов необходимо заранее создать в настройках мастера ```bash salt -N debian test.ping ``` ### Составные подстановки В составных выборках необходимо обрабатывать пробелы, т.к. не ясно где заканчивается условие, а где составное имя **НЕ правильно** - `'G@os:CentOS Strem'` **Правильно** - `'G@os:CentOS?Stream'` **Правильно** - `'P@os:CentOS\sStream'` **Правильно** - `G@os:CentOS*` ```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 ``` [вверх](#краткое-руководство-по-salt-stack) ## Модули исполнения Несколько стандартных модулей - `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 ``` ### Несколько полезных функций - `test.ping` - доступность миньона - `saltutil.sync_all` - синхронизация всех сущностей, которые имеются на мастере - `sys.doc` - получение справки о модуле - `state.test` - проверка возможности исполнения без непосредственного исполнения, алиас для `state.apply test=True` ## Формулы [вверх](#краткое-руководство-по-salt-stack) ## Источники