1. Введение
Для управления конфигурациями серверов, их обслуживания на всём жизненном цикле имеет актуальное значение связка работы трёх компонентов: foreman, puppet, ansible.
Foreman - это инструмент с открытым исходным кодом, предназначенный для помощи системным администраторам в управлении серверами, обеспечивающий простой способ взаимодействия с системами управления конфигурациями (Ansible, Puppet и др.) для автоматизации задач и развертывания приложений. Foreman предоставляет надежный веб-интерфейс пользователя, API и CLI, которые можно использовать для предоставления, настройки и мониторинга серверов. Подходит для инфраструктур любых размеров.
Puppet - это инструмент управления конфигурацией, который помогает системным администраторам автоматизировать предоставление, настройку и управление серверной инфраструктурой.
Ansible - система управления конфигурациями, которая используется для автоматизации настройки и развертывания программного обеспечения. Позволяет организовывать более сложные задачи, например, непрерывное развертывание или непрерывное обновление без простоев.
2. Установка
2.1 Puppet
2.1.1 Предварительная настройка
Коммуникация между Puppet Server и Puppet Agent осуществляется по имени хоста. Для правильной работы нужно настроить либо DNS-сервер, либо файл /etc/hosts.
Укажем для каждой машины hostname. Например, для Puppet Server команда будет иметь следующий вид:
shell $ sudo hostnamectl set-hostname master.astra.lan
Осуществим настройку каждой машины через /etс/hosts, добавив в конец файла FQDN строку с указанием IP-адреса Puppet Server (puppet_ip) и его имени хоста (puppet).
shell master$ sudo echo -e 'puppet_ip\tmaster.astra.lan' >>
/etc/hosts
Произведем настройку локалей.
Проверим наличие локали en_US.utf8 выполнив команду
shell locale -a
При ее отсутствии выполним следующие действия: shell $ sudo apt-get update $ sudo apt-get
install debconf $ dpkg-reconfigure locales
Выбираем из списка локаль en_US.UTF-8, после установки выполняем перезагрузку.
2.1.2 Установка Puppet Server
Для установки выполним следующие команды:
shell master$ sudo apt-get update master$ sudo apt-get
install puppetserver
Для коммуникации Puppet Server использует 8140 порт. Откроем его:
shell master$ sudo ufw allow 8140
Запустим Puppet Server:
shell master$ sudo systemctl start puppetserver
Проверим статус сервиса:
shell master$ 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.
При необходимости добавим его в автозагрузку:
shell master$ sudo systemctl enable puppetserver
2.1.3 Установка Puppet Agent
Для установки выполним следующие команды:
shell agent1$ sudo apt-get update agent1$ sudo apt-get
install puppet-agent
Запустим Puppet Agent и добавим в автозагрузку:
shell agent1$ sudo systemctl start puppet agent1$ sudo
systemctl enable puppet
Отредактируем файл /etc/puppetlabs/puppet/puppet.conf, добавив/заменив в секции main параметры:
server = master.astra.lan
show_diff = true
Выполним команду: shell agent1$ 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 запрос на подпись сертификата.
Для просмотра списка запросов на подпись сертификата выполним следующую команду:
shell master$ 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
Подпишем сертификат:
shell master$ sudo /opt/puppetlabs/bin/puppetserver ca sign
--certname agent1.astra.lan
Successfully signed certificate request for agent1.astra.lan
Проверим работу Puppet Agent после подписания сертификата:
shell agent1$ 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
2.2 Ansible
Для установки выполним следующие команды:
shell master$ sudo apt-get update master$ sudo apt-get
install ansible
Отредактируем файл /etc/ansible/hosts, добавив секцию agents
[agents]
agent1.astra.lan ansible_ssh_host=agent1_server_ip
Ansible использует подключение ssh по ключу, поэтому сгенерируем его:
shell master$ ssh-keygen -t rsa -b 4096
После создания ключа передадим его на нужные узлы:
shell master$ ssh-copy-id user@agent1_server_ip
Проверим работу Ansible, выполнив пинг на группу серверов agents:
shell master$ ansible -m ping agents
agent1.astra.lan | SUCCESS => { "changed": false, "ping": "pong" }
2.3 Foreman
Для установки выполним следующие команды:
shell master$ sudo apt-get update master$ sudo apt-get
install foreman-installer
Запустим установщик:
shell master$ 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:
shell master$ 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 -> Smart 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
shell master$ 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
...
Выполним команду: shell master$ 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 на '*'.
После этого выполнить команды:
shell master$ sudo systemctl restart postgresql master$ sudo systemctl restart foreman