Вводные
- Желание освоить подход Инфраструктура как код (wikipedia)
- Хостовая машина с Windows 10
- Наличие рабочих удаленных виртуальных машин (KVM и LXC)
- Необходимость создавать за раз нескольких связанных VM
- При тестировании по возможности использовать наработки сообщества
Про WSL2 знаю, не устраивает одна виртуальная машина с ubuntu которая непонятно где и как установлена. Docker Desktop удобен для разработки микросервисов и подобному, мне нужен набор VM с настроенными "монолитами" потому что эту связку могу безболезненно переносить в инфраструктуру клиента.
Задача
Развернуть сервер 1С с возможностью аутентификации по OpenID Connect.
В качестве сервера аутентификации буду использовать https://www.keycloak.org/
Вариант решения
Установка, настройка виртуальной машины.
Распространенные под windows: Hyper-V, VMWare, VirtualBox. При решении "в лоб" вручную создается VM, скачивается установочный образ ОС, производится установка, первоначальная настройка. Немного упрощает процесс наличие подготовленных VM с ОС, например для Hyper-V, но донастройку нужно проводить вручную.
Решением подзадачи является использования системы управления виртуальными машинами https://www.vagrantup.com/. Vagrant по сути набор скриптов на Ruby, который обрабатывает декларативное описание и умеет взаимодействовать с API виртуальных машин. В качестве системы виртуализации использую VirtualBox, потому с ним наиболее продвинутая интеграция. Для каждой из систем виртуализации есть своя специфика взаимодействия, например для Hyper-V можно указать только один сетевой интерфейс, остальные добавляются PowerShell скриптом.
Наиболее часто использую Ubuntu 20.04, поэтому обычный конфиг
Vagrant.configure("2") do |config|
# Every Vagrant development environment requires a box. You can search for
# boxes at https://vagrantcloud.com/search.
config.vm.define "srv1c01" do |srv1c01|
srv1c01.vm.box = "ubuntu/focal64"
srv1c01.vm.hostname = "srv1c01.malikov.lan"
srv1c01.vm.network "public_network", bridge: "Realtek PCIe GbE Family Controller"
srv1c01.vm.provision "shell", path: "bootstrap.sh"
end
end
По умолчанию для VirtualBox создается подключение к приватной сети и пробрасывается SSH порт до основного хоста. Добавляю публичную сеть для использования DHCP от своего роутера MikroTik c преобразованием в DNS (пример для MikroTik). Сетевых интерфейсов на моем ПК несколько (от OVPN например), поэтому указываю нужный в параметре bridge, название беру из вывода утилиты от VirtualBox:
VBoxManage.exe list bridgedifs
По умолчанию для VirtualBox создается пользователь vagrant с доступом только по ключу, секретная часть хранится в подпапке проекта ".vagrant". Мне удобнее заходить через putty и в дальнейшем к хостам будет подключаться ansible, поэтому добавляю на создаваемый хост открытую часть своего ключа:
cat /vagrant/authorized_keys >> /home/vagrant/.ssh/authorized_keys
Блок provision отрабатывает только при создании VM или при пересборке при указании ключа --provision. Использую специфику работы с VirtualBox, в которой по умолчанию в целевую машину монтируется текущая папка проекта в "/vagrant".
Обновление установка пакетов
Устанавливать пакеты, делать настройки возможно
- Вручную
- Скомпоновав набор команд в скрипты
- Описав декларативно и передав в систему управления конфигурациями
Для установки сервера 1С "вручную"
Скачиваю с https://releases.1c.ru/ дистрибутив сервер 1С для DEB,
Загружаю дистрибутив на виртуальную машину
vagrant upload c:\Users\Aleksandr\Downloads\deb64_8_3_17_2306.tar.gz /home/vagrant/ srv1c01
Распаковываю, устанавливаю
sudo apt update
tar -xvzf deb64*.tar.gz
sudo dpkg -i 1c-enterprise*.deb
Настройка через декларативное описание
Для управления конфигурациями использую https://www.ansible.com/, потому что он относительно прост не требует "агентов" на управляемых машинах.
Конфиг для VM под Ansible, монтирую папку ansible для размещения в ней playbook-ов.
Vagrant.configure("2") do |config|
config.vm.define "controlnode" do |controlnode|
controlnode.vm.box = "ubuntu/focal64"
controlnode.vm.hostname = "controlnode"
controlnode.vm.network "public_network", bridge: "Realtek PCIe GbE Family Controller"
controlnode.vm.provision "shell", path: "bootstrap.sh"
config.vm.synced_folder "ansible/", "/home/vagrant/ansible"
end
end
Скрипт по установке Ansible. Источники гуглю, например по "install ansible ubuntu 20.04", обычно хватает статей на digitalocean.com
sudo apt-add-repository ppa:ansible/ansible
sudo apt install ansible -y
# Переношу закрытую чать ключа для доступа к остальным VM
sudo cp /home/vagrant/ansible/insecure_private_key /home/vagrant/.ssh/id_rsa
sudo chmod 700 /home/vagrant/.ssh/id_rsa
Чтобы каждый раз не загружать весь архив с дистрибутивом распаковал его и разместил на доступном с VM FTP. После использовал ansible playbook:
---
- hosts: "onec_srv"
become: true
vars:
ansible_ssh_private_key_file: "/home/vagrant/.ssh/id_rsa"
disr_url: "https://selcdn.ru/distrib/srv1c"
version_1c: "8.3.18-1661"
version_1c_dot: "8.3.18.1661"
tasks:
# apt update upgrade
- name: Update all packages to their latest version
ansible.builtin.apt:
update_cache: yes
name: "*"
state: latest
- name: "1C Install a .deb package"
ansible.builtin.apt:
deb: "{{ disr_url }}/1c-enterprise-{{ version_1c_dot }}-{{ item }}_{{ version_1c }}_amd64.deb"
loop:
- common
- server
- ws
с указанием файла hosts
[onec_srv]
server.malikov.lan ansible_user=vagrant
Аутентификация работает через связку "ansible_user=vagrant" и ansible_ssh_private_key_file:
Для сервиса keykloack использую отдельную VM
config.vm.define "auth" do |auth|
auth.vm.box = "ubuntu/focal64"
auth.vm.hostname = "auth"
auth.vm.network "public_network", bridge: "Realtek PCIe GbE Family Controller"
auth.vm.provision "shell", path: "bootstrap.sh"
end
Для настройки использую https://github.com/malikov-pro/ansible-role-keycloak, в репозитории описана роль которую можно переиспользовать подключив её в основной playbook сам репозиторий загрузить в подпапку /roles/keycloak
---
- hosts: "auth"
roles:
- keycloak
vars:
keycloak_admin_password: "123456"
Если есть готовая сборка под docker, а под VM нет готового скрипта
Например сервис PlanUML, работает через maven как собирать с ходу непонятно, но есть готовый докер контейнер, тогда на VM собрать
- Руками https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04-ru
- Небольшим скриптом ansible https://medium.com/@pierangelo1982/install-docker-with-ansible-d078ad7b0a54
- Проработанной ролью https://github.com/geerlingguy/ansible-role-docker
После запустить вручную сервис
docker run -d -p 8080:8080 plantuml/plantuml-server:jetty
Если поискать еще то найдется готовая сборка https://github.com/ansible-playbooks-mamono210/plantuml-server, которая переиспользует роль с docker описанную выше. Заявлено под CentOS, переделать её под Ubuntu думаю не сложно.
Итог
На мой взгляд, достаточно удобно собирать тестовые контуры используя описание для Vagrant и Ansible, после переносить настройки на рабочий контур.
Настройку сервисов 1С и Keycloack опишу в отдельной статье.
Благодарю за внимание.