Введение
Для управления конфигурациями серверов, их обслуживания на всём жизненном цикле имеет актуальное значение связка работы трёх компонентов: foreman, puppet, ansible.
- Foreman - инструмент, предназначенный для помощи системным администраторам в управлении серверами, обеспечивающий простой способ взаимодействия с системами управления конфигурациями (Ansible, Puppet и др.) для автоматизации задач администрирования и развертывания приложений. Foreman поддерживает WEB-интерфейс, API и CLI, которые можно использовать для предоставления, настройки и мониторинга серверов. Подходит для инфраструктур любых размеров.
- Puppet - инструмент управления конфигурацией, который помогает системным администраторам автоматизировать предоставление, настройку и управление серверной инфраструктурой.
- Ansible - система управления конфигурациями, использующаяся для автоматизации настройки и развертывания программного обеспечения. Позволяет автоматизировать сложные задачи, например, непрерывное развертывание или непрерывное обновление без простоев.
Описание стенда
Сервер: 10.0.2.120 master.astra.lan
Клиент: 10.2.121 agent1.astra.lan
На стенде отсутствует настроенный DNS-сервер, поэтому для разрешения IP-адресов используются файлы /etc/host на сервере и клиенте.
Установка
Puppet
Предварительная настройка
Коммуникация между Puppet Server и Puppet Agent осуществляется по имени хоста. Для правильной работы нужно либо настроить DNS-сервер, либо указать адреса хостов в файлах /etc/hosts на всех хостах.
Укажем для каждой машины hostname.
Для сервера Например, для Puppet Server команда будет иметь следующий вид:
Command |
---|
sudo hostnamectl set-hostname master.astra.lan |
Осуществим настройку каждой машины через /etс/hosts, добавив в конец файла FQDN строку с указанием IP-адреса Puppet Server (puppet_ip10.0.2.120) и его имени хоста (puppetmaster.astra.lan).
sudo Для этого на сервере и на клиенте выполним команду:
Command |
---|
echo -e ' |
10.0.2.120\tmaster.astra.lan' |
| sudo tee -a /etc/hosts |
Настройка локалей на сервере.
Проверим наличие локали en_US.utf8 выполнив командукоманду:
Command |
---|
locale -a |
| grep en_US.utf8locale -a | grep en_US.utf8 |
Если локали нет, то выполним для её добавления следующие команды
Информация |
---|
echo "en_US.UTF-8 UTF-8" | sudo tee -a /etc/locale.gen |
Или выберем нужные локали, включая
При ее отсутствии выполним следующие действия: sudo apt update
sudo apt install debconf
dpkg-reconfigure locales
Выбираем из списка локаль en_US.UTF-8 , после установки выполняем перезагрузку.UTF-8 , в интерактивном режиме:
Command |
---|
sudo apt update sudo dpkg-reconfigure locales |
2.1.2 Установка Puppet Server
Для установки выполним на сервере следующие команды:
Command |
---|
sudo apt update |
Для коммуникации Puppet Server использует 8140 порт. Откроем егоЕсли включен межсетевой экран, то нужно разрешить коммуникации через этот порт. Для сетевого экрана ufw:
Command |
---|
sudo ufw allow 8140 |
Запустим Далее разрешим автоматический запуск Puppet Server и запустим его:
Command |
---|
sudo systemctl |
enable 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 |
puppetserver |
Проверим статус сервиса:
Command |
---|
sudo systemctl status |
сен 10 12:35:07 puppet systemd[1]: Starting puppetserver Service...
сен 10 12:35:29 puppet systemd[1]: Started puppetserver Service.
При необходимости добавим его в автозагрузку:
sudo systemctl enablepuppetserver |
2.1.3 Установка Puppet Agent на клиентском
компьютереПри установке сервера puppet клиент на компьютере-сервере устанавливается на этом компьютере автоматически.
Для установки агента на клиентском компьютере выполним на компьютере-агенте следующие команды:
Command |
---|
sudo apt update |
Запустим Puppet Agent и добавим в автозагрузку:
sudo systemctl start puppet
Отредактируем файл /etc/puppetlabs/puppet/puppet.conf, добавив/заменив в секции main параметры:
Информация |
---|
server |
= |
master.astra.lan show_diff |
= |
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.
true |
Запустим службу Puppet Agent и добавим её в автозагрузку:
Информация |
---|
sudo systemctl enable puppet sudo systemctl start puppet |
2.1.4 Подписание сертификатов
При первом запуске служба Puppet Agent отправляет на Puppet Server запрос на подпись сертификата.
Для просмотра списка запросов на подпись сертификата выполним на сервере следующую команду:
Command |
---|
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 |
В примере выше сервер сообщает, что у него имеется один запрос на подпись сертификата от клиента agent1.astra.lan.
Подпишем сертификат:
Command |
---|
sudo /opt/puppetlabs/bin/puppetserver ca sign --certname agent1.astra.lan Successfully |
signed |
certificate |
request |
for |
agent1.astra.lan |
Проверим работу Puppet Agent Для проверки работы агента можно на клиентской машине после подписания сертификата выполнить jcnfyjdbnm cthdbc b следующие команды:
Command |
---|
# Останавливаем службу Info: |
csr_attributes |
file |
loading |
from |
/etc/puppetlabs/puppet/csr_attributes.yaml |
|
Creating |
a |
new |
SSL |
certificate |
request |
for |
agent1.astra.lan |
|
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 |
|
Downloaded |
certificate |
for |
agent1.astra.lan |
from |
puppet |
|
Using |
configured |
environment |
'production' |
|
Retrieving |
pluginfacts |
Info: |
Retrieving |
plugin |
|
Retrieving |
locales |
|
Caching |
catalog |
for |
agent1.astra.lan |
|
Applying |
configuration |
version |
'1568370748' |
|
Creating |
state |
file |
/opt/puppetlabs/puppet/cache/state/state.yaml |
Notice: |
Applied |
catalog |
in |
0.02 |
seconds # Посторно запускаем службу |
2.2 Ansible
Для установки Ansible выполним следующие команды:
Command |
---|
sudo apt update |
Отредактируем файл /etc/ansible/hosts, добавив секцию agents, в котрой укажем имя (agent1.astra.lan) и IP-адрес (10.0.2.121) клиентской машины:
Command |
---|
echo -e "[agents] |
\n agent1.astra.lan |
ansible_ssh_host= |
10.0.2.121" | sudo tee -a /etc/ansible/hosts |
Ansible использует подключение ssh по ключу, поэтому сгенерируем его:
Command |
---|
ssh-keygen -t rsa -b 4096 |
После создания ключа передадим его на нужные узлы:
Command |
---|
ssh-copy-id |
user@10.0.2.121 |
Проверим работу Ansible, выполнив пинг на группу серверов agents:
Command |
---|
ansible -m ping agents agent1.astra.lan | SUCCESS => { "changed": false, "ping": "pong" } |
2.3 Foreman
Для установки пакета Foreman выполним следующие команды:
Command |
---|
sudo apt update |
Запустим установщик:
Command |
---|
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 |
8140 |
The |
full |
log |
is |
at |
/var/log/foreman-installer/foreman.log |
Проверим работоспособность foreman-proxy:
Command |
---|
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 *********************************************************************
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 на '*'.
После этого выполнить команды:
sudo systemctl restart postgresql
sudo systemctl restart foreman