Puppet — кроссплатформенное клиент-серверное приложение, которое позволяет централизованно управлять конфигурацией операционных систем и программ, установленных на нескольких компьютера
https://redos.red-soft.ru/base/redos-8_0/8_0-administation/8_0-remote-admin/8_0-puppet/
https://wiki.astralinux.ru/pages/viewpage.action?pageId=353635618
| host | ip | OS |
| server.5house.loc | 192.168.122.202 | Astra Linux 1.8 (Debian) |
| astra1.5house.loc | 192.168.122.152 | Astra Linux 1.7 (Debian) |
| redos8.5house.loc | 192.168.122.59 | RedOS (Centos) |
Настройка репозиториев Astra Linux
/etc/apt/sources.list , раскомментируйте строчку подключения к сетевым репозиториям
nano /etc/apt/sources.list
# deb cdrom:[OS Astra Linux 1.8.3.8 1.8_x86-64 DVD ]/ 1.8_x86-64 contrib main non-free non-free-firmware
deb https://download.astralinux.ru/astra/stable/1.8_x86-64/repository-main/ 1.8_x86-64 main contrib non-free non-free-firmware
deb https://download.astralinux.ru/astra/stable/1.8_x86-64/repository-extended/ 1.8_x86-64 main contrib non-free non-free-firmware
Обновление кэша пакетов и установка пакета сертиикатов
sudo apt update
apt install ca-certificates
Установка Сервера puppet на Astra linux 1.7/1.8
apt install openjdk-11-jre-headless puppetserver
apt install openjdk-17-jre-headless puppetserver
PuppetServer использует Java и Ruby для работы
После установки пакетов, включите и добавьте в автозапуск Puppet:
systemctl enable puppetserver
systemctl start puppetserver
Проверить, что сервис успешно стартует можно командой
root@server:~# systemctl status puppetserver
● puppetserver.service - Puppet Server
Loaded: loaded (/lib/systemd/system/puppetserver.service; enabled; preset: enabled)
Active: active (running) since Mon 2026-04-20 11:16:16 MSK; 1min 11s ago
Далее перейдем к установке настройки клиента на машине Astra1 (Astra Linux 1.7)
sudo apt update
sudo apt install puppet-agent
sudo nano /etc/hosts
192.168.122.202 server.5house.loc server
127.0.2.1 puppet
nano /etc/puppet/puppet.conf
[main]
server = server.5house.loc
Далее перейдем к установке клиента на машине RedOS (RedOS 8 Centos)
sudo dnf install puppet
sudo nano /etc/hosts
192.168.122.202 server.5house.loc server
127.0.2.1 puppet
nano /etc/puppetlabs/puppet/puppet.conf
[agent]
server = server.5house.loc
show_diff = true
Запустите Агент puppet на клиентском хосте
sudo systemctl start puppet
Попробуем выполнить тестовое подключение с клиента (astra linux,redOS), с помощью команды
whereis puppet
sudo /opt/puppetlabs/puppet/bin/puppet agent -tv
sudo /usr/bin/puppet agent -tv
Info: Creating a new RSA SSL key for astra1
Info: csr_attributes file loading from /etc/puppetlabs/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for astra1
Info: Certificate Request fingerprint (SHA256): 6E:1E:EB:1A:4D:27:B2:C1:E1:BA:EE:3B:B0:57:1A:10:1D:19:6F:AE:B7:D3:C7:2E:E1:B2:6E:0C:24:3D:18:CC
Info: Certificate for astra1 has not been signed yet
Couldn't fetch certificate from CA server; you might still need to sign this agent's certificate (astra1).
Exiting now because the waitforcert setting is set to 0.
Теперь агент успешно связался с сервером и отправил запрос на подпись сертификата SSL.
Остался последний шаг — подписать этот запрос на стороне Puppet-сервера.
Error: Server hostname ‘server.5house.loc’ did not match server certificate; expected one of server, DNS:puppet, DNS:server
Удаление сертификатов с клиентского хость
sudo rm -rf /etc/puppetlabs/puppet/ssl
Puppet использует SSL-сертификаты для идентификации и авторизации компьютеров. Сертификаты самоподписные и выдаются встроенным в Puppet центром сертификации.
Одобрим запрос с сервера. Для начала выведем список всех заявок с помощью команды:
whereis puppetserver
sudo /opt/puppetlabs/bin/puppetserver ca list
sudo puppetserver ca list --all
sudo ss -tlnp | grep 8140
sudo puppetserver ca list
Requested Certificates:
astra1 (SHA256) 9E:B0:59:37:7D:AE:20:4A:00:30:8E:78:C9:A8:38:79:A1:3F:59:69:3A:5C:2F:58:68:EB:BF:85:DE:76:4E:E8
redos8. (SHA256) 80:FE:4B:33:54:E2:DF:8E:32:CF:38:2C:F2:F1:92:69:41:82:14:50:31:88:AD:74:08:71:43:98:21:E4:F3:60
На сервере выполним подписание запроса от клиента, с помощью команды:
sudo /opt/puppetlabs/bin/puppetserver ca sign –certname astra1.5house.loc
sudo /opt/puppetlabs/bin/puppetserver ca sign –certname redos8
sudo puppetserver ca sign --certname astra1
sudo puppetserver ca sign --certname redos8.5house.local
Successfully signed certificate request for redos8.5house.local
В Puppet добавили функцию автоматической выдаче сертификата, если в
имени компьютера присутствует какой-нибудь общий элемент.
Конечно, это имя домена *.5house.loc !
Для реализации автовыдачи сертификатов SSL нужно:
Создайте файл /etc/puppetlabs/puppet/autosign.conf со следующим
содержимым:
puppet config print autosign --section master
cd /etc/puppet/
touch autosign.conf
nano autosign.conf
*.5house.loc
chown puppet:puppet autosign.conf
Выполните перезагрузку службы Puppet на сервере.
systemctl restart puppet
После подписания сертификата, попробуем вновь выполнить
принудительное подключение с клиента.
whereis puppet
sudo /opt/puppetlabs/puppet/bin/puppet agent -tv
nfo: Using environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Retrieving locales
Info: Caching catalog for astra1
Info: Applying configuration version '1776682695'
Notice: Applied catalog in 0.01 seconds
/usr/bin/puppet agent -tv
Info: Refreshed CRL: 00:C1:37:83:20:2B:D5:C7:9F:0C:AB:F1:F2:02:1F:80:86:43:C5:18:85:FD:63:0D:D7:2B:24:C1:71:6C:C0:DD
Info: Creating a new RSA SSL key for redos8.5house.loc
Info: csr_attributes file loading from /etc/puppetlabs/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for redos8.5house.loc
Info: Certificate Request fingerprint (SHA256): C0:C9:4F:C3:F0:D6:15:15:C0:47:DB:AF:59:17:4E:4F:EF:55:A2:C1:E5:38:88:7F:2A:CB:76:DD:34:A7:0E:F5
Info: Downloaded certificate for redos8.5house.loc from https://server.5house.loc:8140/puppet-ca/v1
Info: Using environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for redos8.5house.loc
Info: Applying configuration version '1776682695'
Info: Creating state file /var/lib/puppet/state/state.yaml
Notice: Applied catalog in 0.02 seconds
Успешное подключение!
Создадим первое манифест правило, для нашей Puppet инфраструктуры.
Установка пакета ПО Yandex Browser
Убедимся, что данного ПО нет на клиенте
yandex-browser-stable
-bash: yandex-browser-stable: команда не найдена
apt search yandex-browser
dnf list installed yandex-browser-stable
Создадим файл install_package_YB.pp. название не важно, исключительно
важно его местоположение и расширение — *.pp.
Файл располагается по пути –
sudo mkdir -p /etc/puppetlabs/code/environments/production/manifests
или mkdir -p /etc/puppet/code/environments/production/manifests
nano install_package_YB.pp
package { 'yandex-browser-stable':
ensure => installed,
}
Проверим с клиента, выполните принудительное подключение или ожидайте
30 минут
sudo /opt/puppetlabs/puppet/bin/puppet agent -tv
sudo /usr/bin/puppet agent -tv
sudo /usr/bin/puppet agent -tv
[sudo] пароль для andrey:
Info: Using environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for redos8.5house.loc
Info: Applying configuration version '1776685729'
Notice: /Stage[main]/Main/Package[yandex-browser-stable]/ensure: created
Notice: Applied catalog in 15.22 seconds
Удалим пакет YB руками
sudo apt remove yandex-browser-stable
Выполним обращение к серверу с клиента
sudo /opt/puppetlabs/puppet/bin/puppet agent -tv
Info: Using environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Retrieving locales
Info: Caching catalog for astra1
Info: Applying configuration version '1776686934'
Notice: /Stage[main]/Main/Package[yandex-browser-stable]/ensure: created (corrective)
Notice: Applied catalog in 19.11 seconds
Если наоборот, пакет yandex-browser-stable нужно будет удалить, то можно сделать так:
nano /etc/puppet/code/environments/production/manifests/install_package_YB.pp
package { 'yandex-browser-stable':
ensure => absent,
}
Проверка с клиента
sudo /opt/puppetlabs/puppet/bin/puppet agent -tv
sudo /usr/bin/puppet agent -tv
Info: Using environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Retrieving locales
Info: Caching catalog for astra1
Info: Applying configuration version '1776687176'
Notice: /Stage[main]/Main/Package[yandex-browser-stable]/ensure: removed
Notice: Applied catalog in 1.50 seconds
Попробуем распространить на подчиненные устройства конфигурацию удаленного доступа SSH через файл
Создадим файл на сервере:
/etc/puppetlabs/puppet/fileserver.conf
/etc/puppet touch fileserver.conf
mkdir /etc/puppet/code/files
создание этого файла необходимо, чтобы включить на сервере Puppet режим файлового сервера. Содержимое файла:
nano fileserver.conf
[files]
path /etc/puppet/code/files
allow *
Выполните перезагрузку puppetserver
sudo systemctl restart puppetserver
Скопируем конфигурационный файл sshd_config в директорию
cp /etc/ssh/sshd_config /etc/puppet/code/files
Также, выдайте файлу другие права доступа, в каталоге files.
sudo chown -R root:puppet /etc/puppet/code/files
sudo chmod 755 sshd_config
Выполним настройку файла sshd_config, например. Давайте сменим порт для
SSH с 22 на 222
nano sshd_config
port 222
Создаём новый манифест файл config_ssh.pp
cd /etc/puppet/code/environments/production/manifests
touch config_ssh.pp
nano config_ssh.pp
file {'/etc/ssh/sshd_config':
ensure => file,
path => '/etc/ssh/sshd_config',
source => 'puppet:///files/sshd_config',
mode => '0755',
owner => 'root',
group => 'root',
}
service {'sshd':
ensure => running,
subscribe => File['/etc/ssh/sshd_config']
}
Самый простой и правильный способ проверить синтаксис — использовать встроенную команду puppet parser validate.
puppet parser validate /etc/puppet/code/environments/production/manifests/config_ssh.pp
Данный манифест распространяет собственный sshd_config файл в путь к клиенту и выполняет перезагрузку службы sshd только при условии, если файл был изменен.
Проверим результат на клиенте
sudo /opt/puppetlabs/puppet/bin/puppet agent -tv
sudo /usr/bin/puppet agent -tv
-#Port 22
+Port 222
Info: Computing checksum on file /etc/ssh/sshd_config
Info: /Stage[main]/Main/File[/etc/ssh/sshd_config]: Filebucketed /etc/ssh/sshd_config to puppet with sum 4e53556b2b73f61d9b828691e25cbbde
Notice: /Stage[main]/Main/File[/etc/ssh/sshd_config]/content: content changed '{md5}4e53556b2b73f61d9b828691e25cbbde' to '{md5}8f8e22bdaed88edfc4c7af1ba3a72d3d'
Info: /Stage[main]/Main/File[/etc/ssh/sshd_config]: Scheduling refresh of Service[sshd]
Notice: /Stage[main]/Main/Service[sshd]: Triggered 'refresh' from 1 event
Notice: Applied catalog in 0.25 seconds
Проверим прослушиваемые порты на клиенте
ss -natu | grep 222
tcp LISTEN 0 128 0.0.0.0:222 0.0.0.0:*
tcp LISTEN 0 128 [::]:222 [::]:*
#redos
sudo semanage port -l | grep ssh
sudo semanage port -a -t ssh_port_t -p tcp 222
ssh -p 222 andrey@astra1
Манифест система выполняет установку пакета virt-manager и xrdp.
cd /etc/puppet/code/environments/production/manifests/
nano install_pkg_vm_xrdp.pp
sudo /opt/puppetlabs/puppet/bin/puppet agent -tv
[sudo] пароль для andrey:
Info: Using environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Retrieving locales
Info: Caching catalog for astra1
Info: Applying configuration version '1776692895'
Notice: /Stage[main]/Main/Package[virt-manager]/ensure: created
Notice: Applied catalog in 38.55 seconds
Манифест Система выполняет настройку службы xrdp. Меняет порт с 3389 на 1337 и перезапускает службу после изменения конфигурации.
Диагностируем текущий файл настроек xrdp на клиенте
grep "port=" /etc/xrdp/xrdp.ini
сd /etc/puppet/code/environments/production/manifests/
nano config_xrdp.pp
# 1. Меняем порт (команда sed универсальна)
exec { 'update_xrdp_port':
command => "/usr/bin/sed -i 's/^port=3389/port=1337/' /etc/xrdp/xrdp.ini",
onlyif => "/usr/bin/grep -q '^port=3389' /etc/xrdp/xrdp.ini",
path => ['/usr/bin', '/bin', '/usr/sbin'],
notify => Service['xrdp'],
}
# 2. Настройка безопасности и брандмауэра в зависимости от ОС
if $facts['os']['family'] == 'RedHat' {
# Только для Red OS / CentOS
exec { 'selinux_xrdp_1337':
command => '/usr/sbin/semanage port -a -t ssh_port_t -p tcp 1337',
unless => '/usr/sbin/semanage port -l | grep -q 1337',
path => ['/usr/bin', '/usr/sbin'],
before => Service['xrdp'],
}
exec { 'firewall_xrdp_1337':
command => '/usr/bin/firewall-cmd --permanent --add-port=1337/tcp && /usr/bin/firewall-cmd --reload',
unless => '/usr/bin/firewall-cmd --list-all | grep 1337',
path => ['/usr/bin', '/bin'],
}
} elsif $facts['os']['family'] == 'Debian' {
# Только для Astra Linux / Debian / Ubuntu
exec { 'ufw_allow_xrdp_1337':
command => '/usr/sbin/ufw allow 1337/tcp',
unless => '/usr/sbin/ufw status | grep -q 1337',
path => ['/usr/sbin', '/usr/bin', '/bin'],
}
}
Проверим прослушиваемые порты клиент пк
ss -natu | grep 3389
sudo /opt/puppetlabs/puppet/bin/puppet agent -tv
ss -natu | grep 1337
Манифест система выполняет создание служебного локального пользователя по
имени – autouser с паролем P@ssw0rd. Пользователь должен быть
работоспособен.
Шифрование пароля через whois или openssl
sudo apt install whois
mkpasswd -m sha-512 P@ssw0rd
openssl passwd -6 P@ssw0rd » usser.pp
$6$wt5CXy5AQwxbtI0L$.0VeOzsXTnU9lhOo7R1knU2X8kKSzrDtHtV/kaSocRLcRZIVA8jBTypZGzIodnIdxM8StU4JtxJVCTaTl3Hgj0
cd /etc/puppet/code/environments/production/manifests
nano user.pp
node 'astra1' {
user {'UsersAstra':
name => 'autouser',
home => '/home/autouser',
managehome => true,
shell => '/bin/bash',
ensure => present,
password => '$y$j9T$fq7KAAuXh1z0UZlYCCMhk/$Ci1G.ln6EiK2bsn8wlhP0F9vLuKDe3xeNh5DTQDr/s4',
groups => ['sudo'],
}
}
node 'redos8.5house.loc' {
user {'UsersRedOS':
name => 'autouser',
home => '/home/autouser',
managehome => true,
shell => '/bin/bash',
ensure => present,
forcelocal => true,
password => '$y$j9T$zzUtoEesp/BmVBhNc8pDE0$qJkEWvDe7i6TnVyJG09grFHmKhVYs4Z1bnXhJVSP41C',
groups => ['wheel'],
}
}
Проверка изменений на клиенте
sudo /opt/puppetlabs/puppet/bin/puppet agent -tv
Notice: /Stage[main]/Main/Node[astra1]/User[UsersAstra]/ensure: created
id autouser
uid=1002(autouser) gid=1003(autouser) группы=1003(autouser),27(sudo)
sudo grep autouser /etc/shadow
Сменить пользователя в консоли
su — autouser
Манифест не работает, для RedOS – хэш пароля не записывается в etc/shadow