1. Была установлена OS Astra Linux. Системе было присвоено имя «VM01». Далее были произведены настройки сети: осуществление подключения к внешней сети через соединение с NAT.
- Bash-скрипт:
sudo su # Получение прав администратора
nm-connection-editor # Открытие настроек сетевого подключения
- В настройках сетевого подключения было добавлено новое подключение: «Соединение типа «Ethernet».
Далее соединение было создано и ему было присвоено имя «mainLock». Метод соединения изменён.
Соединение на VM01 было изменено с «Соединение по умолчанию» на «mainLock».
2. Далее была успешно развёрнута вторая виртуальная машина, с отличным IP-адресом.
3. На второй виртуальной машине (которой было присвоено имя «VM02»), было установлено средство управления SaltStack master:
Bash-скрипт:
# Добавление ключа репозитория SaltStack для master
wget -O - https://repo.saltstack.com/py3/debian/11/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -
# Добавление репозитория SaltStack в нашу систему
echo "deb https://repo.saltstack.com/py3/debian/11/amd64/latest/SALTSTACK-GPG-KEY.pub xenial main" >> /etc/apt/sources.list.d/saltstack.list
# После добавления репозитория и ключа репозитория
apt update
apt install salt-master -y
Результат:
4. На первой виртуальной машине (VM01) был установлен SaltStack minion.
Bash-скрипт:
# Добавление ключа репозитория SaltStack для master
wget -O - https://repo.saltstack.com/py3/debian/11/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -
# Добавление репозитория SaltStack в нашу систему
echo "deb https://repo.saltstack.com/py3/debian/11/amd64/latest/SALTSTACK-GPG-KEY.pub xenial main" >> /etc/apt/sources.list.d/saltstack.list
# После добавления репозитория и ключа репозитория
apt update
apt install salt-minion -y
5. Была произведена настройка подключения агента SaltStack minion к средству управления SaltStack master.
Bash-скрипт:
# На VM01
sudo su
cd /etc/salt/minion.d
touch tikhomirov.conf
vi tikhomirov.conf
# Записываем в файл .conf
master: 192.168.0.155 # 192.168.0.155 - IP-адрес master'а
master_port: 4506 # 4506 - это тот порт, по которому мастер отдаёт команды для minion's
После того как были установлены и настроены мастер и миньоны Salt, они были запущены:
# На VM02
systemctl start salt-master
# На VM01
systemctl start salt-minion
Последним шагом в процессе установки является то, что мастер соли принимает ключи миньона соли. Как только ключи приняты, мастер Salt может отдавать команды миньону и получать входящие сообщения от миньона.
Salt Master (Мастер) – это сервер, который выступает в качестве центра управления для своих миньонов, именно от Master отправляются запросы на удаленное выполнение команд.
В папку системы с SaltStack master был установлен дистрибутив nginx.
sudo apt install nginx
1. Далее был написан скрипт для SaltStack передачи файла дистрибутива nginx в папку /tmp на ВМ01 средствами SaltStack.
Листинг программ:
- Вариант Bash-скрипта:
#!/bin/bash
minion_id="key_2" # ID миньона, на который нужно передать файл
file_path="/etc/nginx/" # путь к файлу на мастер-ноде
dest_path="/tmp" # путь к папке, в которую нужно передать файл на миньоне
salt "$minion_id" cp.push "$file_path" "$dest_path/"
В данном скрипте переменные minion_id
, file_path
и dest_path
можно заменить на соответствующие значения для конкретного случая.
Команда cp.push
передает файл с мастер-ноды на заданный миньон. Она принимает два параметра: путь к файлу на мастер-ноде и путь к папке на миньоне, куда нужно передать файл. В данном случае файл передается из папки /etc/nginx
на мастер-ноде в папку /tmp
на миньоне.
- Вариант Groovy-скрипта:
import org.yaml.snakeyaml.Yaml // импортируем библиотеку для чтения YAML-файлов
def minion = 'minion-name' // имя minion, на который нужно передать файл
def source = '/path/to/nginx.tar.gz' // путь к дистрибутиву nginx на master
def target = '/tmp/nginx.tar.gz' // путь, по которому нужно разместить дистрибутив на minion
// генерируем YAML-файл для передачи данных
def data = """
${minion}:
file.managed:
- source: ${source}
- dest: ${target}
"""
// отправляем данные на master и применяем изменения на minion
def result = sh "salt ${minion} state.apply ${data}"
println(result)
Однако, при попытке отправки дистрибутива, master выдаёт исключение:
Хотя minion работает и опция принятия файлов включена:
Листинг программ:
- Скрипт на Bash:
#!/bin/bash
# Устанавливаем nginx из папки /tmp
sudo apt-get update
sudo apt-get install -y nginx
sudo cp /tmp/nginx.conf /etc/nginx/nginx.conf
# Перезапускаем nginx
sudo systemctl restart nginx.service
Этот скрипт обновляет список пакетов, устанавливает nginx и копирует конфигурационный файл из /tmp/nginx.conf
в /etc/nginx/nginx.conf
. Затем он перезапускает службу nginx, чтобы применить изменения.
- Скрипт, написанный на Groovy:
import org.yaml.snakeyaml.Yaml
import com.google.common.collect.ImmutableList
salt = new Salt()
// Получаем список minion
minions = salt.cmd('*', 'test.ping')
// Формируем параметры для установки Nginx
nginxParams = [
'name': 'nginx',
'pkgs': ImmutableList.of('nginx'),
'fromrepo': 'nginx',
'allow_downgrade': false,
'refresh_db': true,
'saltenv': 'base',
'source': 'salt://nginx/custom_config',
'cwd': '/tmp'
]
// Устанавливаем Nginx на каждом minion
minions.each { minion ->
salt.cmd(minion, 'pkg.install', new Yaml().dump(nginxParams))
}
В данном примере мы используем библиотеку Salt, чтобы выполнять команды на minion через master. Сначала мы получаем список minion с помощью команды test.ping
. Затем мы формируем параметры для установки Nginx в виде YAML-структуры и передаем их в команду pkg.install
. В качестве источника пакета указываем настраиваемый конфигурационный файл Nginx из папки /tmp.
Листинг программ:
- Скрипт на Bash:
https://github.com/Ossowitz/Case4/blob/master/.idea/script3.sh
#!/bin/bash
salt 'key-2' cmd.run 'echo "Hello Rosatom" > /tmp/index.html' # key_2 - это имя minion
salt 'key_2' cmd.run 'sudo cp /tmp/index.html /var/www/html' # key_2 - это имя minion
salt 'key_2' cmd.run 'sudo systemctl restart nginx' # key_2 - это имя minion
- Скрипт на Groovy:
Для выполнения данной задачи в SaltStack можно использовать Groovy и модуль salt.modules.file
для работы с файлами на удаленных узлах. Вот пример скрипта:
import salt.modules.file
String minionId = 'webserver'
String file = '/usr/share/nginx/html/index.html'
String content = '<html><body>Hello Rosatom</body></html>'
// Проверяем, что файл существует на удаленном узле
if (salt.modules.file.file_exists(minionId, file)) {
// Заменяем содержимое файла на строку "Hello Rosatom"
salt.modules.file.replace(minionId, file, content)
} else {
println("Файл $file не найден на $minionId")
}
В данном скрипте мы указываем id узла-миниона webserver
, на котором нужно заменить содержимое файла '/usr/share/nginx/html/index.html'
. Если файл существует, то заменяем его содержимое на указанную строку. Если файла не существует, то выводим сообщение об ошибке.
Для запуска скрипта в SaltStack мы можем использовать модуль salt.modules.cmd
, например так:
import salt.modules.cmd
String command = 'groovy /path/to/script.groovy'
String output = salt.modules.cmd.run(command)
println(output)
Здесь мы запускаем скрипт /path/to/script.groovy
на SaltStack master и получаем результат выполнения через модуль salt.modules.cmd
.