Оглавление |
---|
Информация | ||
---|---|---|
|
|
Предупреждение |
---|
Развертывание службы Foreman следует выполнять на отдельном сервере, без работающих служб, использующих web-сервер apache2. В частности, не следует применять настоящую инструкция на контроллерах домена FreeIPA. |
Введение
Для управления конфигурациями серверов, их обслуживания на всём жизненном цикле имеет актуальное значение связка работы трёх компонентов: foreman, puppet, ansible.
- Foreman - инструмент, предназначенный для помощи системным администраторам в управлении серверами, обеспечивающий простой способ взаимодействия с системами управления конфигурациями (Ansible, Puppet и др.) для автоматизации задач администрирования и развертывания приложений. Foreman поддерживает WEBweb-интерфейс, API и CLI, которые можно использовать для предоставления, настройки и мониторинга серверов. Подходит для инфраструктур любых размеров.
- Puppet - инструмент управления конфигурацией, который помогает системным администраторам автоматизировать предоставление, настройку и управление серверной инфраструктурой.
- Ansible - система управления конфигурациями, использующаяся для автоматизации настройки и развертывания программного обеспечения. Позволяет автоматизировать сложные задачи, например, непрерывное развертывание или непрерывное обновление без простоев.
Установка
Puppet
Предварительная настройка
Коммуникация между Puppet Server и Puppet Agent осуществляется по имени хоста. Для правильной работы нужно либо настроить DNS-сервер, либо указать адреса хостов в файлах /etc/hosts на всех хостах.
Укажем для каждой машины hostname. Например, для Puppet Server команда будет иметь следующий вид:
sudo hostnamectl set-hostname master.astra.lan
Осуществим настройку каждой машины через /etс/hosts, добавив в конец файла FQDN строку с указанием IP-адреса Puppet Server (puppet_ip) и его имени хоста (puppet).
sudo echo -e 'puppet_ip\tmaster.astra.lan' >> /etc/hosts
Произведем настройку локалей.
Проверим наличие локали en_US.utf8 выполнив команду
locale -a
При ее отсутствии выполним следующие действия: sudo apt update
sudo apt install debconf
dpkg-reconfigure locales
Выбираем из списка локаль en_US.UTF-8, после установки выполняем перезагрузку.
2.1.2 Установка Puppet Server
Для установки выполним следующие команды:
sudo apt update
sudo apt install puppetserver
Для коммуникации Puppet Server использует 8140 порт. Откроем его:
sudo ufw allow 8140
Запустим Puppet Server:
sudo systemctl start puppetserver
Проверим статус сервиса:
sudo systemctl status puppetserver
● puppetserver.service - puppetserver Service Loaded: loaded (/lib/systemd/system/puppetserver.service; disabled; vendor preset: enabled) Active: active (running) since Thu 2019-09-10 12:35:29 MSK; 49s ago Process: 1968 ExecStart=/opt/puppetlabs/server/apps/puppetserver/bin/puppetserver start (code=exited, status=0/SUCCESS) Main PID: 1975 (java) Tasks: 48 (limit: 4915) CGroup: /system.slice/puppetserver.service └─1975 /usr/bin/java -Xms2g -Xmx2g -Djruby.logger.class=com.puppetlabs.jruby_utils.jruby.Slf4jLogger -Djava.security.egd=file:/dev/urandom -XX:OnOutOfMemoryError=kill -9 %p -cp /
сен 10 12:35:07 puppet systemd[1]: Starting puppetserver Service...
сен 10 12:35:29 puppet systemd[1]: Started puppetserver Service.
При необходимости добавим его в автозагрузку:
sudo systemctl enable puppetserver
2.1.3 Установка Puppet Agent на клиентском компьютере
При установке сервера puppet клиент на компьютере-сервере устанавливается на этом компьютере автоматически.
Для установки агента на клиентском компьютере выполним на компьютере-агенте следующие команды:
sudo apt update
sudo apt-get install puppet-agent
Запустим Puppet Agent и добавим в автозагрузку:
sudo systemctl start puppet
Отредактируем файл /etc/puppetlabs/puppet/puppet.conf, добавив/заменив в секции main параметры:
server = master.astra.lan
show_diff = true
sudo /opt/puppetlabs/bin/puppet agent --test
Info: Downloaded certificate for ca from puppet
Info: Downloaded certificate revocation list for ca from puppet
Info: Creating a new RSA SSL key for agent1.astra.lan
Info: csr_attributes file loading from /etc/puppetlabs/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for agent1.astra.lan
Info: Certificate Request fingerprint (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
Info: Certificate for agent1.astra.lan has not been signed yet
Couldn't fetch certificate from CA server; you might still need to sign this agent's certificate (agent1.astra.lan).
Exiting now because the waitforcert setting is set to 0.
2.1.4 Подписание сертификатов
При первом запуске Puppet Agent отправляет на Puppet Server запрос на подпись сертификата.
Для просмотра списка запросов на подпись сертификата выполним следующую команду:
sudo /opt/puppetlabs/bin/puppetserver ca list
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
Подпишем сертификат:
sudo /opt/puppetlabs/bin/puppetserver ca sign --certname agent1.astra.lan
Successfully signed certificate request for agent1.astra.lan
Проверим работу Puppet Agent после подписания сертификата:
sudo /opt/puppetlabs/bin/puppet agent --test
Info: csr_attributes file loading from /etc/puppetlabs/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for agent1.astra.lan
Описание стенда
Сервер: 10.0.2.120 master.astra.lan
Клиент: 10.0.2.121 agent1.astra.lan
Далее подразумевается, что на сервере и клиенте используются одинаковые имена пользователей. Если имена пользователй разные то нужно соответствующим образом изменить команды передачи ключей SSH.
На стенде отсутствует настроенный DNS-сервер, поэтому для разрешения IP-адресов используются файлы /etc/hosts на сервере и на клиенте.
Информация |
---|
На сервере должно быть установлено не менее 3ГБ оперативной памяти. |
Установка Puppet
Настройка сервера
Имя и адрес сервера
Коммуникация между Puppet Server и Puppet Agent осуществляется по имени хоста. Для правильной работы нужно либо настроить DNS-сервер, либо указать адреса хостов в файлах /etc/hosts на всех хостах.
Для сервера используем имя master.astra.lan, и команда назначения имени будет иметь следующий вид (команда выполняется на сервере):
Command |
---|
sudo hostnamectl set-hostname master.astra.lan |
Осуществить настройку каждой машины через файл /etс/hosts, для чего внести в файл указание IP-адреса Puppet Server (10.0.2.120) и его имён (master.astra.lan, master и pupet). В итоге файл /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 выполнив команду:
Command |
---|
locale -a | grep en_US.utf8 |
Если локали en_US.utf8 нет, то добавить её, выполнив следующие команды
Command |
---|
echo "en_US.UTF-8 UTF-8" | sudo tee -a /etc/locale.gen |
Или можно выбрать нужные локали, включая локаль en_US.UTF-8 UTF-8 , в интерактивном режиме, выполнив следующие команды:
Command |
---|
sudo apt update sudo dpkg-reconfigure locales |
Установка Puppet Server
Для установки выполнить на сервере следующие команды:
Command |
---|
sudo apt update |
Для коммуникации Puppet Server использует IP-порт 8140. Если включен межсетевой экран, то разрешить коммуникации через этот порт. Для сетевого экрана ufw:
Command |
---|
sudo ufw allow 8140 |
Разрешить автоматический запуск Puppet Server и запустим его:
Command |
---|
sudo systemctl enable puppetserver |
Проверить статус сервиса:
Command |
---|
sudo systemctl status puppetserver |
Установка Puppet Agent на клиентском компьютере
Имя и адрес клиентского компьютера
Настроить статический IP-адрес сервера (далее - 10.0.2.121)
Задать имя компьютера:
Command |
---|
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
|
Можно просто скопировать ранее созданный файл /etc/hosts с сервера.
Установка агента
Для установки агента выполнить на компьютере-агенте следующие команды (при этом будет установлен агент и сервер SSH для удалённого управления агентом):
Command |
---|
sudo apt update |
Отредактировать файл /etc/puppetlabs/puppet/puppet.conf, добавив/заменив в секции main параметры:
Блок кода |
---|
server = master.astra.lan
show_diff = true |
Для коммуникации агент, как и Puppet Server, использует IP-порт 8140. Если включен межсетевой экран, то разрешить коммуникации через этот порт. Для сетевого экрана ufw:
Command |
---|
sudo ufw allow 8140 |
Добавить службу Puppet Agent в автозагрузку и запустить её:
Command |
---|
sudo systemctl enable puppet sudo systemctl start puppet |
Настройка доступа по ssh
На клиентской машине задать пароль root и разрешить root-доступ по ssh, для чего в файле /etc/ssh/sshd_config раскомментировать параметр PermitRootLogin, изменить его значение на yes и перезапустить сервер SSH (команды выполняются на клиентской машине):
Command |
---|
sudo passwd root |
Подписание сертификатов клиента
При первом запуске клиентская служба Puppet Agent отправит на Puppet Server запрос на подпись сертификата. Для просмотра списка запросов на подпись сертификата выполнить на сервере следующую команду:
Command | ||
---|---|---|
| ||
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 |
В примере выше сервер сообщает, что у него имеется один запрос на подпись сертификата от клиента с именем
Info: Downloaded certificate foragent1.astra.lan
from puppetInfo: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Retrieving locales
Info: Caching catalog for agent1.astra.lan
Info: Applying configuration version '1568370748'
Info: Creating state file /opt/puppetlabs/puppet/cache/state/state.yaml
Notice: Applied catalog in 0.02 seconds
2.2 Ansible
Для установки выполним следующие команды:
sudo apt update
sudo apt install ansible
Отредактируем файл /etc/ansible/hosts, добавив секцию agents
[agents]
agent1.astra.lan ansible_ssh_host=agent1_server_ip
Ansible использует подключение ssh по ключу, поэтому сгенерируем его:
ssh-keygen -t rsa -b 4096
После создания ключа передадим его на нужные узлы:
ssh-copy-id user@agent1_server_ip
Проверим работу Ansible, выполнив пинг на группу серверов agents:
ansible -m ping agents
agent1.astra.lan | SUCCESS => {
"changed": false,
"ping": "pong"
}
2.3 Foreman
Для установки выполним следующие команды:
sudo apt update
sudo apt install foreman-installer
Запустим установщик:
sudo foreman-installer
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 8140The full log is at /var/log/foreman-installer/foreman.log
Проверим работоспособность foreman-proxy:
sudo curl -k -X GET -H Accept:application/json https://master.astra.lan:8443/features --tlsv1
["httpboot","logs","puppet","puppetca","tftp"]
3. Настройка
3.1 Foreman + Puppet
Откроем в браузере ссылку https://master.astra.lan
В качестве логина и пароля используем initial credentials, которые получили после выполнения установщика.
Перейдем в Infrastructure -> HTTP Proxies и добавим наш прокси:
Нажмем на кнопку Submit.
Теперь перейдем в Hosts -> All Hosts, где должен появится список доступных узлов:
Если узлы отсутствуют, то достаточно на нужных узлах выполнить команду sudo /opt/puppetlabs/bin/puppet agent --test
и обновить данную страницу.
3.2 Foreman + Ansible
Установим необходимые плагины:
для работы с 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
Проверим работу связки. Создадим файл cat_hosts.yml со следующим содержимым:
---
- hosts: all
become: true
tasks:
- name: cat /etc/hosts
command: cat /etc/hosts
register: cat_all_hosts
...
Выполним команду:ansible-playbook cat_file.yml -vv
В результате получим следующий вывод:
Using /etc/ansible/ansible.cfg as config file
PLAYBOOK: cat_file.yml *********************************************************
1 plays in cat_file.yml
PLAY [all] *********************************************************************
TASK [setup] *******************************************************************
ok: [agent1.astra.lan]
TASK [cat /etc/hosts] **********************************************************
task path: /home/user/cat_file.yml:6
changed: [agent1.astra.lan] => {"changed": true, "cmd": ["cat", "/etc/hosts"], "delta": "0:00:00.002691", "end": "2019-09-16 12:25:29.241611", "rc": 0, "start": "2019-09-16 12:25:29.238920", "stderr": "", "stdout": "127.0.0.1\tlocalhost\n127.0.1.1\tastra-orel\n\n172.16.119.182 master.astra.lan\n172.16.119.183 agent1.astra.lan\n\n# The following lines are desirable for IPv6 capable hosts\n::1 localhost ip6-localhost ip6-loopback\nff02::1 ip6-allnodes\nff02::2 ip6-allrouters", "stdout_lines": ["127.0.0.1\tlocalhost", "127.0.1.1\tastra-orel", "", "172.16.119.182 master.astra.lan", "172.16.119.183 agent1.astra.lan", "", "# The following lines are desirable for IPv6 capable hosts", "::1 localhost ip6-localhost ip6-loopback", "ff02::1 ip6-allnodes", "ff02::2 ip6-allrouters"], "warnings": []}
PLAY RECAP *********************************************************************
.
Подписать сертификат:
Command | ||
---|---|---|
| ||
Successfully signed certificate request for agent1.astra.lan |
Для проверки правильности работы агента можно на клиентской машине после подписания сертификата выполнить следующие команды:
Остановить службу
Command sudo systemctl stop puppet
Выполнить тестирование работы службы, в процессе которого служба запросит и получит сертификат:
Command Title sudo /opt/puppetlabs/bin/puppet agent --test Info: csr_attributes file loading from /etc/puppetlabs/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for agent1.astra.lan
Info: Certificate Request fingerprint (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
Info: Downloaded certificate for agent1.astra.lan from puppet
Info: Using configured environment 'production'
Info: Retrieving pluginfacts Info: Retrieving plugin
Info: Retrieving locales
Info: Caching catalog for agent1.astra.lan
Info: Applying configuration version '1568370748'
Info: Creating state file /opt/puppetlabs/puppet/cache/state/state.yaml Notice: Applied catalog in 0.02 secondsПовторно запустить службу:
Command sudo systemctl start puppet
Установка пакетов Ansible и Foreman
Установить пакеты Ansible и Foreman, выполнив на сервере следующие действия:
Установить пакет ansible из репозитория:
Command |
---|
sudo apt install ansible |
Настройка /etc/ansible/hosts
Отредактировать файл /etc/ansible/hosts, добавив в файл секцию [agents] (т.е. добавив группу серверов, с названием этой группы agents). В этой группе пока будет один сервер с именем agent1.astra.lan и IP-адресом 10.0.2.121:
Command |
---|
echo -e "agents:\n hosts:\n agent1.astra.lan:\n ansible_user: root" | sudo tee -a /etc/ansible/hosts |
В результате файл /etc/ansible/hosts должен иметь следующий вид:
Блок кода |
---|
agents:
hosts:
agent1.astra.lan:
ansible_user: root |
Предупреждение |
---|
В примере используется YAML-формат файла. Отступы (количество пробелов в начале строки) должны быть соблюдены. Использование символов табуляции не допускается. |
Ansible использует подключение ssh без запроса пароля по ключу, поэтому нужно сгенерировать ключ:
Command |
---|
ssh-keygen -f ~/.ssh/id_rsa -N '' |
Информация |
---|
Ключ должен быть сгенерирован и передан от имени пользователя, от которого будут выполняться команды ansible. Если команды ansible предполагается выполнять от sudo, то генерировать и передавать ключ следует также от sudo (можно сгенерировать и передать ключи для нескольких пользователей ). |
И после создания ключа передать его на нужные узлы:
Command |
---|
ssh-copy-id -i ~/.ssh/id_rsa root@agent1.astra.lan |
Проверить работу Ansible, выполнив пинг на группу серверов agents:
Command | ||
---|---|---|
| ||
agent1.astra.lan | SUCCESS => { "changed": false, "ping": "pong" } |
Базовая настройка Foreman
Установить пакеты:
В случае, если ОС была установлена без графической оболочки, то установить пакет shared-mime-info, команда:
Command |
---|
sudo apt install shared-mime-info |
Установить пакет foreman-installer:
Command |
---|
sudo apt install foreman-installer |
Предупреждение |
---|
Перед выполнением дальнейших действий следует проверить, что в файле /etc/debian_version указано значение 9.0, и, если там указано иное значение, заменить его на 9.0. |
Запустить установщик:
Предупреждение | ||
---|---|---|
После установки в строке "Initial credentials are admin / ...." будет указан логин admin и указан автоматически созданный пароль для входа в web-интерфейс, его рекомендуется запомнить чтобы использовать для входа в web-интерфейс.В дальнейшем пароль возможно изменить с помощью команды:
|
Command | ||
---|---|---|
| ||
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:
Command | ||
---|---|---|
| ||
["httpboot","logs","puppet","puppetca","tftp"] |
Настройка
Foreman + Puppet
Открыть в браузере ссылку https://master.astra.lan (подтвердить согласие на подключение)
В качестве логина и пароля использовать имя admin и автоматически созданный пароль, полученный после выполнения установщика.
Перейти в "Узлы" - "All hosts" ("Hosts" -> "All Hosts" в английском варианте), где должен появится список доступных узлов:
Если узлы отсутствуют, то подождать, пока информация обновится, или на нужных узлах (на клиенте) выполнить команду:
Command |
---|
sudo systemctl restart puppet |
После чего обновить страницу web-интерфейса.
Убедиться, что в "Инфраструктура" - "Капсулы" ( в английском варианте "Infrastructure" -> "Smart Proxies") имеется отображение созданного по умолчанию proxy. Если proxy не создан, то:
- Перейти в "Администратор" - "Местоположения" ("Administer" - "Locations");
- Выбрать Default location;
- Нажать кнопку "Устранить несоответствия" ("Fix mismatches");
- Нажать кнопку "Применить" ("Submit");
- Аналогично "Администратор" - "Организации" ("Administer" - "Organizations");
- Выбрать Default organization;
- Нажать кнопку "Устранить несоответствия" ("Fix mismatches");
- Нажать кнопку "Применить" ("Submit");
После выполнения этих шагов в "Инфраструктура" - "Капсулы" ( в английском варианте "Infrastructure" -> "Smart Proxies") появится отображение созданного по умолчанию proxy.
Foreman + Ansible
Установить необходимые плагины:
для работы с Ansible: foreman-plugin-ansible, foreman-proxy-plugin-ansible;
для запуска Ansible playbooks как запланированные задачи: foreman-plugin-remote-execution, foreman-proxy-plugin-remote-execution-ssh
Command |
---|
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):
Command |
---|
sudo -u foreman-proxy ssh-keygen -f ~foreman-proxy/.ssh/id_rsa_foreman_proxy -N '' |
Проверить работу связки можно запустив Ansible playbook. Запустить Ansible playbook можно несколькими способами (при этом нужно будет указать команду или сценарий для выпонения на удалённой машине):
- Через список узлов (хостов):
- открыть страницу "Узлы" ("Узлы" -> "All Hosts");
- выбрать необходимые узлы;
- нажать "Действия" -> "Scheduled Remote Job";
- Через страницу узла:
- открыть страницу "Узлы" ("Узлы" -> "All Hosts");
- перейти на страницу нужного узла и нажать "Scheduled Remote Job" -> "Run Ansible roles";
- Через список заданий:
- открыть страницу "Шаблоны заданий"
- напротив нужного шаблона нажать "Выполнить"
Ansible-роли могут быть импортированы из смарт-прокси. Для этого необходимо:
- перейти на страницу "Ansible roles" ("Настройки" -> "Роли")
- выбрать источник импорта из выпадающего меню справа.
Пример использования
См. Настройки служб времени с помощью Ansible и Puppet|
agent1.astra.lan : ok=2 changed=1 unreachable=0 failed=0
Возможные проблемы
При запуске сервиса 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/9.6/main/postgresql.conf, изменив значение параметра listen_addresses на '*'.
После этого выполнить
командыкоманду:
Command |
---|
sudo systemctl restart postgresql |
sudo systemctl restart
foreman |