Для Astra Linux Special Edition РУСБ.10015-01 x.7 требуется подключение расширенного репозитория (см. Репозитории Astra Linux Special Edition x.7: структура, особенности подключения и использования). |
| Развертывание службы Foreman следует выполнять на отдельном сервере, без работающих служб, использующих web-сервер apache2. В частности, не следует применять настоящую инструкция на контроллерах домена FreeIPA (см. Контроллер ЕПП FreeIPA в Astra Linux). |
Для управления конфигурациями серверов и их обслуживания на всем жизненном могут использоваться следующие программные компоненты.
Сервер: 10.0.2.120 master.astra.lan
Клиент: 10.0.2.121 agent1.astra.lan
Далее подразумевается, что на сервере и клиенте используются одинаковые имена пользователей. Если имена пользователей разные, то необходимо использовать актуальные имена, соответствующим образом изменив команды передачи ключей SSH.
На стенде отсутствует настроенный DNS-сервер, поэтому для разрешения IP-адресов используются файлы /etc/hosts на сервере и на клиенте.
| На сервере должно быть установлено не менее 3ГБ оперативной памяти. |
Коммуникация между службами Puppet Server и Puppet Agent осуществляется по имени хоста, на котором расположена служба. Для правильной работы служб нужно:
Серверу назначается имя master.astra.lan. Команда назначения имени будет иметь следующий вид (команда выполняется на сервере):
sudo hostnamectl set-hostname master.astra.lan |
На каждом хосте необходимо осуществить настройку разрешения имен через файл /etс/hosts. Для этого внести в файл строку с указанием IP-адреса хоста (10.0.2.120) и его имен (master.astra.lan, master и puppet). В итоге файл /etc/hosts должен выглядеть примерно так:
127.0.0.1 localhost 10.0.2.120 master.astra.lan master puppet 10.0.2.121 agent1.astra.lan agent1 # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters |
Подразумевается, что серверу назначен статический IP-адрес 10.0.2.120, а клиенту - 10.0.2.121.
Проверить наличие региональной настройки en_US.utf8 выполнив команду:
| locale -a | grep en_US.utf8 |
Если региональной настройки en_US.utf8 нет, то добавить её, выполнив следующие команды
echo "en_US.UTF-8 UTF-8" | sudo tee -a /etc/locale.gen |
Или можно выбрать нужные региональные настройки, включая региональную настройку en_US.UTF-8 UTF-8 , в интерактивном режиме, выполнив следующие команды:
| sudo apt update sudo dpkg-reconfigure locales |
| При работе в Astra Linux Special Edition x.7.0 и x.7.1 подключить расширенный репозиторий, для обновлений выпущенный ранее обновления БЮЛЛЕТЕНЬ № 2022-0819SE17 (оперативное обновление 1.7.2) также подключить компонент расширенного репозитория astra-ce (см. Репозитории Astra Linux Special Edition x.7: структура, особенности подключения и использования). |
Для установки выполнить на сервере следующие команды:
sudo apt update |
Указание пакета в команде установки пакета openjdk-11-jre-headless необходимо для того, чтобы он обновился из расширенного репозитория если был установлен ранее.
Для коммуникации Puppet Server использует IP-порт 8140. Если включен межсетевой экран, то разрешить коммуникации через этот порт. Для сетевого экрана ufw:
| sudo ufw allow 8140 |
Разрешить автоматический запуск Puppet Server и запустим его:
sudo systemctl enable puppetserver |
Проверить статус сервиса:
| systemctl status puppetserver |
Настроить статический IP-адрес сервера (далее - 10.0.2.121)
Задать имя компьютера:
| sudo hostnamectl set-hostname agent1.astra.lan |
Настроить разрешение имён сервера и клиента с помощью файла /etc/hosts. Файл /etc/hosts на клиентском компьютере должен иметь примерно такой вид:
127.0.0.1 localhost 10.0.2.121 agent1.astra.lan agent1 10.0.2.120 master.astra.lan master puppet # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters |
Для установки агента выполнить на компьютере-агенте следующие команды (при этом будет установлен агент и сервер SSH для удалённого управления агентом):
sudo apt update |
Отредактировать файл /etc/puppetlabs/puppet/puppet.conf, добавив параметры:
server = master.astra.lan show_diff = true |
Для коммуникации агент, как и Puppet Server, использует IP-порт 8140. Если включен межсетевой экран, то разрешить коммуникации через этот порт. Для сетевого экрана ufw:
| sudo ufw allow 8140 |
Добавить службу Puppet Agent в автозагрузку и запустить её:
| sudo systemctl enable puppet sudo systemctl start puppet |
Для настройки доступа к клиентской машине по протоколу ssh:
Создать отдельного пользователя с домашним каталогом:
| sudo useradd -m <имя_пользователя> |
опция -m указывает на необходимость создания домашнего каталога. Далее выбранное имя пользователя должно быть указано реестре клиентских машин на сервере (файле /etc/ansible/hosts);
Задать пароль для этого пользователя:
| sudo passwd <имя_пользователя> |
Разрешить пользователю выполнять команды с использованием sudo. Это можно сделать создав файл /etc/sudoers.d/<имя_пользователя> с указанием привилегии выполнять любые команды без запроса пароля ALL=NOPASSWD: ALL:
| echo "<имя_пользователя> ALL=NOPASSWD: ALL" | sudo tee -a /etc/sudoers.d/<имя_пользователя> |
Часто предлагаемый для упрощения вариант использования на клиентской машине пользователя root является нежелательным с точки зрения безопасности. При использовании этого варианта помимо задания пароля для пользователя root необходимо разрешить доступ пользователю root через ssh. Для включения доступа root через ssh в файле /etc/ssh/sshd_config раскомментировать параметр PermitRootLogin, изменить его значение на yes и перезапустить службу SSH (команды выполняются на клиентской машине):
|
При первом запуске клиентская служба Puppet Agent отправит на Puppet Server запрос на подпись сертификата. Для просмотра списка запросов на подпись сертификата выполнить на сервере следующую команду:
| Requested Certificates: agent1.astra.lan (SHA256) F7:D5:E5:AB:AA:86:7F:EF:19:3D:D9:B9:E3:E9:63:DC:AE:31:17:57:67:3D:2B:D7:A5:1C:71:E3:46:E0:A7:1E |
В примере выше сервер сообщает, что у него имеется один запрос на подпись сертификата от клиента с именем agent1.astra.lan.
Подписать сертификат:
| Successfully signed certificate request for agent1.astra.lan |
Для проверки правильности работы агента можно на клиентской машине после подписания сертификата выполнить следующие команды:
Остановить службу
sudo systemctl stop puppet |
Выполнить тестирование работы службы, в процессе которого служба запросит и получит сертификат:
Info: csr_attributes file loading from /etc/puppetlabs/puppet/csr_attributes.yaml |
Повторно запустить службу:
| sudo systemctl start puppet |
Установить пакеты Ansible и Foreman, выполнив на сервере следующие действия:
Установить пакет ansible из репозитория:
sudo apt install ansible |
Отредактировать файл /etc/ansible/hosts, добавив в файл секцию [agents] (т.е. добавив группу серверов, с названием этой группы agents). В этой группе пока будет один сервер с именем agent1.astra.lan и IP-адресом 10.0.2.121:
echo -e "agents:\n hosts:\n agent1.astra.lan:\n ansible_user: <имя_пользователя>" | sudo tee -a /etc/ansible/hosts |
В качестве значения параметра ansible_user вместо <имя_пользователя> должно быть указано имя пользователя, созданного на клиенте для удаленного доступа.
В результате файл /etc/ansible/hosts должен иметь следующий вид (пользователь для удаленного доступа - username):
agents: hosts: agent1.astra.lan: ansible_user: username |
| В примере используется YAML-формат файла. Отступы (количество пробелов в начале строки) должны быть соблюдены. Использование символов табуляции не допускается. |
Ansible использует подключение ssh без запроса пароля по ключу, поэтому нужно сгенерировать ключ:
ssh-keygen -f ~/.ssh/id_rsa -N '' |
| Ключ должен быть сгенерирован и передан от имени пользователя, от которого будут выполняться команды ansible. Если команды ansible предполагается выполнять от sudo, то генерировать и передавать ключ следует также от sudo (можно сгенерировать и передать ключи для нескольких пользователей ). |
После создания ключа передать его на нужные узлы, подключаясь к ним от имени пользователя, созданного для удаленного доступа:
ssh-copy-id -i ~/.ssh/id_rsa <имя_пользователя>@agent1.astra.lan |
Проверить работу Ansible, выполнив пинг на группу серверов agents:
| agent1.astra.lan | SUCCESS => { "changed": false, "ping": "pong" } |
Установить на сервере пакеты:
В случае, если ОС была установлена без графической оболочки, установить пакет shared-mime-info, команда:
| sudo apt install shared-mime-info |
Установить пакет foreman-installer:
| sudo apt install foreman-installer |
| Перед выполнением дальнейших действий следует проверить, что в файле /etc/debian_version указано значение 9.0, и, если там указано иное значение, заменить его на 9.0. |
При завершении работы установщика в его выводе в строке "Initial credentials are admin / ...." будет указан логин admin и указан автоматически созданный пароль для входа в web-интерфейс, его рекомендуется запомнить чтобы использовать для входа в web-интерфейс. В дальнейшем пароль возможно изменить с помощью команды:
|
| Preparing installation Done * Foreman is running at https://master.astra.lan Initial credentials are admin / NRLJth9ufmAkTsF5 * Foreman Proxy is running at https://master.astra.lan:8443 * Puppetmaster is running at port 8140 The full log is at /var/log/foreman-installer/foreman.log |
| В строке "Initial credentials are admin / ...." указан логин admin и указан автоматически созданный пароль для входа в web-интерфейс, его рекомендуется запомнить чтобы использовать для входа в web-интерфейс. |
Проверить работоспособность foreman-proxy:
["httpboot","logs","puppet","puppetca","tftp"] |
Открыть в браузере ссылку https://master.astra.lan (подтвердить согласие на подключение)

В качестве логина и пароля использовать имя admin и автоматически созданный пароль, полученный после выполнения установщика.

Если узлы отсутствуют, то подождать, пока информация обновится, или на нужных узлах (на клиенте) выполнить команду:
| sudo systemctl restart puppet |
После чего обновить страницу web-интерфейса.
Убедиться, что в "Инфраструктура" - "Капсулы" ( в английском варианте "Infrastructure" -> "Smart Proxies") имеется отображение созданного по умолчанию proxy. Если proxy не создан, то:
После выполнения этих шагов в "Инфраструктура" - "Капсулы" ( в английском варианте "Infrastructure" -> "Smart Proxies") появится отображение созданного по умолчанию proxy.
Установить необходимые плагины:
для работы с Ansible: foreman-plugin-ansible, foreman-proxy-plugin-ansible;
для запуска Ansible playbooks как запланированные задачи: foreman-plugin-remote-execution, foreman-proxy-plugin-remote-execution-ssh
| sudo foreman-installer --enable-foreman-plugin-ansible \ --enable-foreman-proxy-plugin-ansible \ --enable-foreman-plugin-remote-execution \ --enable-foreman-proxy-plugin-remote-execution-ssh |
Создать и скопировать ключ для работы каждого клиента с сервера (команда выполняется на сервере от имени пользователя foreman-proxy, подключение выполняется от имени пользователя для удаленного доступа):
sudo -u foreman-proxy ssh-keygen -f ~foreman-proxy/.ssh/id_rsa_foreman_proxy -N '' |
Проверить работу связки можно запустив Ansible playbook. Запустить Ansible playbook можно несколькими способами (при этом нужно будет указать команду или сценарий для выпонения на удалённой машине):
Роли ansible могут быть импортированы из смарт-прокси. Для этого необходимо:
Для настройки передачи данных из ansible в foreman:
При работе в Astra Linux Common Edition 2.12 (и в любых ОС с отсутствующей версией python2) в настройки ansible (файл /etc/ansible/hosts) добавить директиву:
ansible_python_interpreter: /usr/bin/python3 Например agents: hosts: client.astra.lan: ansible_user: vagrant client2.astra.lan: # ALSE 1.7 ansible_user: vagrant alce.astra.lan: # ALCE 2.12.44 ansible_user: vagrant ansible_python_interpreter: /usr/bin/python3 |
Иначе при добавлении хоста с помощью ansible (см. ниже) будет возникать ошибка:
"module_stderr": "Shared connection to alce.astra.lan closed.\r\n", "module_stdout": "/bin/sh: /usr/bin/python: Нет такого файла или каталога\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", |
в секцию [defaults] добавить строки:
bin_ansible_callbacks = True callback_whitelist = foreman |
команда для добавления указанных строк:
| sudo sed -i "/\[defaults\]/a bin_ansible_callbacks = True\ncallback_whitelist = foreman" /etc/ansible/ansible.cfg |
Добавить секцию [callback_foreman] следующего вида:
[callback_foreman] url = https://`hostname` ssl_cert = /etc/puppetlabs/puppet/ssl/certs/master.astra.lan.pem ssl_key = /etc/puppetlabs/puppet/ssl/private_keys/master.astra.lan.pem verify_certs = /etc/puppetlabs/puppet/ssl/certs/ca.pem |
команда для добавления:
| echo "[callback_foreman] url = https://`hostname` ssl_cert = /etc/puppetlabs/puppet/ssl/certs/master.astra.lan.pem ssl_key = /etc/puppetlabs/puppet/ssl/private_keys/master.astra.lan.pem verify_certs = /etc/puppetlabs/puppet/ssl/certs/ca.pem" | sudo tee -a /etc/ansible/ansible.cfg |
Параметры для добавления секции можно скопировать из одноименной секции файла /etc/foreman-proxy/ansible.cfg;
В графическом интерфейсе foreman добавить хост, с которого будет приниматься информация: "Администратор" - "Параметры" - закладка "Безопасность и проверка подлинности" - "Trusted hosts":List of hostnames, IPv4, IPv6 addresses or subnets to be trusted in addition to Smart Proxies for access to fact/report importers and ENC output. Имя хоста указать в квадратных скобках (синтаксис списка python). При необходимости указания подсетей использовать формат бесклассовой адресации (Classless Inter-Domain Routing, CIDR), например 10.2.0.0/24;
Для проверки работы выполнить команду:
| sudo ansible -m setup localhost |
После выполнения команды в графическом интерфейсе foreman в списке хостов должен появиться новый хост (для команды выше - localhost). Если в команде указать имя клиента, например:
| sudo ansible -m setup client.example.com |
то в список хостов добавится хост с указанным именем (для команды выше - client.example.com)
| Далее приводятся примеры команд, выполняющихся без проверки и подтверждения подлинности. Это небезопасно, но может быть необходимо для создания автоматических сценариев массового развертывания и настройки клиентских машин. |
Автоматическую передачу паролей для подключения клиенту ssh и инструменту передачи ключей ssh-copy-id обеспечивает инструмент sshpass (пакет sshpass). Пакет может быть установлен командой:
| sudo apt install sshpass |
Для использования инструмента:
Создать файл для хранения паролей:
| touch <имя_файла> |
Запретить чтение файла всем, кроме владельца:
| chmod 600 <имя_файла> |
Команды передачи ключей, приведенные выше, использовать в виде:
| sshpass -f <имя_файла> ssh-copy-id -i ~/.ssh/id_rsa <имя_пользователя>@agent1.`hostname -d` -o StrictHostKeyChecking=no |
или
| sudo -u foreman-proxy sshpass -f <имя_файла> ssh-copy-id -i ~foreman-proxy/.ssh/id_rsa_foreman_proxy <имя_пользователя>@agent1.astra.lan -o StrictHostKeyChecking=no |
где:
опция -f <имя_файла> указывает из какого файла брать пароль для подключения;Другие возможности инструмента sshpass см. в справке:
| man sshpass |
См. Настройки служб времени с помощью Ansible и Puppet.
Проблема:
При запуске сервиса foreman появляется ошибка:
| /usr/share/foreman/vendor/ruby/2.3.0/gems/pg-1.1.4/lib/pg.rb:56:in `initialize': could not connect to server: No such file or directory (PG::ConnectionBad) |
Решение:
Отредактировать файл /etc/postgresql/*/main/postgresql.conf, изменив значение параметра listen_addresses на '*'.
После этого выполнить команду:
| sudo systemctl restart postgresql foreman |
Проблема:
Не стартует puppetserver.service. В /var/log/syslog сообщения:
|
Решение:
На сервере должно быть установлено не менее 3ГБ оперативной памяти (как указано в инструкции).
| Обновление через несколько версий (например, с версии 3.11 сразу на версию 3.13) не поддерживается. Для выполнения таких обновлений требуется последовательно обновиться до каждой промежуточной версии, выполняя все инструкции. |
Перед началом выполнения обновления создать резервные копии:
| sudo foreman-rake db:dump |
| sudo tar -czvf etc_foreman.tar.gz /etc/foreman |
| sudo tar -czvf var_lib_puppet_dir.tar.gz /var/lib/puppet/ssl |
| sudo systemctl stop apache2 foreman.service foreman.socket dynflow\* |
sudo foreman-rake db:migrate |
sudo foreman-rake tmp:cache:clear |
| su - postgres -c 'vacuumdb --full --dbname=foreman' |
| sudo foreman-installer --noop --verbose |
/Stage[main]/Foreman_proxy::Register/Foreman_smartproxy[foreman-hostname.domain]: Could not evaluate: Connection refused - connect(2). |
| sudo foreman-installer |
| sudo systemctl start apache2 foreman.service foreman.socket |