Настройка Ansible Lab с Vagrant и Virtualbox в Linux
Как настроить Ansible Lab с помощью Vagrant в Linux
Ansible — это платформа автоматизации, используемая в области оркестрации, управления конфигурацией, развертывания, обеспечения и т. д. Если вы новичок, желающий изучить Ansible, или планируете пройти сертификацию по Ansible, вам необходимо иметь домашнюю лабораторию для практики ansible. Настройка домашней лаборатории вручную – трудоемкая задача. Существует несколько автоматизированных решений, таких как Docker, Vagrant и облачные решения, которые можно использовать для создания лаборатории ansible. В этом руководстве мы изучим автоматический способ настройки лаборатории Ansible с помощью Vagrant и VirtualBox в Linux.
Vagrant — отличный инструмент для быстрой настройки среды разработки. Если вы новичок в vagrant, я предлагаю вам взглянуть на наше введение в руководство Vagrant.
- Руководство по Vagrant. Начало работы с Vagrant в Linux
Для целей данного руководства мы будем использовать Vagrant с VirtualBox в качестве провайдера для создания нашей лаборатории ansible. Вы также можете использовать KVM вместо VirtualBox. Если вы хотите использовать KVM в качестве поставщика, обратитесь к статье ниже о том, как использовать vagrant с KVM.
- Как использовать Vagrant с поставщиком KVM Libvirt
Настройка лаборатории Ansible
В качестве предварительного условия вам необходимо установить Vagrant и Virtualbox на вашем компьютере с Linux. Если вы еще не установили Vagrant, обратитесь к следующему руководству по установке Vagrant в различных дистрибутивах Linux.
- Как установить Vagrant в Linux
Мы создадим трехузловую лабораторную установку Ansible. Один узел будет действовать как главный/контроллерный узел, а два узла будут действовать как управляемые узлы. В демонстрационных целях я использую бродячую коробку ubuntu/focal64.
Вот подробности моей лабораторной настройки Ansible.
NODE TYPE | NODE NAME | IP ADDRESS | OS FLAVOR |
Control Node | controller.anslab.com | 192.168.10.3 | ubuntu/focal64 |
Managed Node | managed1.anslab.com | 192.168.10.4 | ubuntu/focal64 |
Managed Node | managed2.anslab.com | 192.168.10.5 | ubuntu/focal64 |
Настройка трехузловой лаборатории Ansible
Здесь я настраиваю только три узла для своей лаборатории, но при настройке собственной лаборатории вы можете добавить столько управляемых узлов, сколько пожелаете.
Клонировать репозиторий проекта
Я разместил все необходимые файлы для настройки лаборатории Ansible в своем репозитории GitHub. Запустите следующую команду, чтобы клонировать репозиторий локально.
git clone --recursive https://github.com/KarthickSudhakar/Ansible_lab_vagrant_virtualbox.git
Давайте пройдемся по каталогу проекта, чтобы увидеть, какие файлы присутствуют.
Структура проекта
Позвольте мне кратко рассказать вам о каждом файле.
1. Бродячий файл
В этом файле хранятся все конфигурации, относящиеся к виртуальной машине. Вот содержимое этого файла.
-*- mode: ruby -*-
vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.provider "virtualbox" do |rs|
rs.memory = 2048
rs.cpus = 2
end
# Will not check for box updates during every startup.
config.vm.box_check_update = false
# Master node where ansible will be installed
config.vm.define "controller" do |controller|
controller.vm.box = "ubuntu/focal64"
controller.vm.hostname = "controller.anslab.com"
controller.vm.network "private_network", ip: "192.168.10.3"
controller.vm.provision "shell", path: "bootstrap.sh"
controller.vm.provision "file", source: "key_gen.sh", destination: "/home/vagrant/"
end
# Managed node 1.
config.vm.define "m1" do |m1|
m1.vm.box = "ubuntu/focal64"
m1.vm.hostname = "managed1.anslab.com"
m1.vm.network "private_network", ip: "192.168.10.4"
m1.vm.provision "shell", path: "bootstrap.sh"
end
# Managed node 2.
config.vm.define "m2" do |m2|
m2.vm.box = "ubuntu/focal64"
m2.vm.hostname = "managed2.anslab.com"
m2.vm.network "private_network", ip: "192.168.10.5"
m2.vm.provision "shell", path: "bootstrap.sh"
end
end
2. bootstrap.sh
Это скрипт оболочки, отвечающий за настройку ansible в узле контроллера, установку пакетов, изменение конфигурации системы.
Содержимое этого файла приведено ниже:
#!/usr/bin/env bash
vagrant by default creates its own keypair for all the machines. Password based authentication will be disabled by default and enabling it so password based auth can be done.
sudo sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
sudo systemctl restart sshd
Supressing the banner message everytime you connect to the vagrant box.
touch /home/vagrant/.hushlogin
Updating the hosts file for all the 3 nodes with the IP given in vagrantfile
192.168.10.3 controller.ansible.com controller
192.168.10.4 managed1.ansible.com managed1
192.168.10.5 managed2.ansible.com managed2
echo -e "192.168.10.3 controller.anslab.com controller\n192.168.10.4 managed1.anslab.com managed1\n192.168.10.5 managed2.anslab.com managed2" >> /etc/hosts
Installing necessary packages
sudo apt update && sudo apt -y install curl wget net-tools iputils-ping python3-pip sshpass
Install ansible using pip only in controller node
if [[ $(hostname) = "controller" ]]; then
sudo pip3 install ansible
fi
3. key_gen.sh
Этот сценарий следует запустить вручную после завершения сборки всех трех виртуальных машин. Этот скрипт позаботится о создании пары ключей ssh и распределит ее по всем трем узлам. Он также запустит образец специальной команды ansible для проверки.
Содержимое этого файла приведено ниже:
#!/usr/bin/env bash
THIS SCRIPT WILL CREATE SSH KEYPAIR AND DISTRIBUTE ACROSS ALL NODES
ssh-keygen -b 2048 -t rsa -f /home/vagrant/.ssh/id_rsa -q -N ""
LOOPING THROUGH AND DISTRIBUTING THE KEY
for val in controller managed1 managed2; do
echo "-------------------- COPYING KEY TO ${val^^} NODE ------------------------------"
sshpass -p 'vagrant' ssh-copy-id -o "StrictHostKeyChecking=no" vagrant@$val
done
CREATE THE INVENTORY FILE
PROJECT_DIRECTORY="/home/vagrant/ansible_project/"
mkdir -p $PROJECT_DIRECTORY
cd $PROJECT_DIRECTORY
Creating the inventory file for all 3 nodes to run some adhoc command.
echo -e "controller\n\n[ubuntu1]\nmanaged1\n\n[ubuntu2]\nmanaged2" > inventory
echo -e "[defaults]\ninventory = inventory" > ansible.cfg
echo -e "-------------------- RUNNING ANSBILE ADHOC COMMAND - UPTIME ------------------------------"
echo
running adhoc command to see if everything is fine
ansible all -i inventory -m "shell" -a "uptime"
echo
Все эти три файла размещены в моем репозитории GitHub. Не стесняйтесь вносить свой вклад и улучшать его.
Понимание конфигурации Vagrantfile
Прежде чем создавать лабораторную работу Ansible, вам необходимо понять конфигурации внутри Vagrantfile и сценариев оболочки.
1. Распределение памяти и напряжения
Для всех трех бродячих ящиков нам нужно настроить значение памяти и процессора. Здесь для памяти установлено значение 2 ГБ, а для ЦП — 2. Если вы хотите увеличить или уменьшить лимит, просто отрегулируйте выделенные параметры в Vagrantfile.
Память и напряжение
2. Вариант ОС
Все три узла (контроллер и управляемый) используют образ Ubuntu 20.04 LTS. Поэтому, когда вы запускаете команду «vagrant up
», vagrant будет искать следующий параметр и пытаться получить изображение, если оно недоступно локально.
Вариант ОС
3. Настройки сети
По умолчанию vagrant использует NAT на первом интерфейсе (адаптер1). Vagrant использует переадресацию портов через NAT для подключения к виртуальной машине. Здесь мы задаем имя хоста и статические IP-адреса для всех трех виртуальных машин в частной сети.
Будет создан отдельный интерфейс (Адаптер2), и ему будет присвоен статический IP-адрес. Виртуальные машины, входящие в частную сеть, могут взаимодействовать друг с другом.
В среде с несколькими виртуальными машинами бродяга автоматически исправит коллизию портов.
==> m2: Fixed port collision for 22 => 2222. Now on port 2201.
==> m2: Clearing any previously set network interfaces...
==> m2: Preparing network interfaces based on configuration...
m2: Adapter 1: nat
m2: Adapter 2: hostonly
==> m2: Forwarding ports...
m2: 22 (guest) => 2201 (host) (adapter 1)
==> m2: Running 'pre-boot' VM customizations...
==> m2: Booting VM...
==> m2: Waiting for machine to boot. This may take a few minutes...
m2: SSH address: 127.0.0.1:2201
Сеть и имя хоста
4. Имя пользователя и связь по SSH
Существует пользователь по умолчанию с именем «vagrant» и паролем «vagrant». Пользователь Vagrant имеет привилегию sudo без пароля, настроенную на виртуальной машине по умолчанию.
По умолчанию проверка подлинности на основе пароля для виртуальной машины отключена. Vagrant создаст пару ключей ssh и будет использовать закрытый ключ для подключения к виртуальной машине при запуске команды «vagrant ssh
».
vagrant ssh controller
vagrant ssh m1
vagrant ssh m2
Аутентификация на основе пароля включается через файл bootstrap.sh
, поэтому вы можете подключиться к узлу, используя IP-адрес и аутентификацию на основе пароля вместо аутентификации на основе ключей.
5. Начальный скрипт
Скрипт bootstrap.sh отвечает за
- Включение аутентификации на основе пароля.
- Создайте файл
.huhlogin
, чтобы отключить баннерное сообщение по умолчанию. - Добавьте записи хостов в файл
/etc/hosts
для всех трех узлов. - Установка необходимых пакетов.
- Установка ansible через менеджер пакетов Python (pip) только на узле контроллера.
Я использую средство подготовки оболочки, где файл bootstrap.sh будет скопирован в папку /tmp/
на всех трех виртуальных машинах, и сценарий будет запущен с правами root.
Поставщик оболочки
Внимание! Если вы создаете лабораторию на основе RHEL, вам следует отредактировать команду установки пакета из файла bootstrap.sh
в соответствии с dnf
или об/мин
. Остальное будет одинаково во всех дистрибутивах.
6. Создать пару ключей
Ansible использует пару ключей SSH для связи с управляемыми узлами и выполнения задачи. Новые ключи должны генерироваться на узле контроллера и передаваться всем управляемым узлам, чтобы ansible мог взаимодействовать с управляемыми узлами, не запрашивая каждый раз пароли.
Скрипт key_gen.sh
позаботится о создании ключей ssh и распространении ключей на все узлы. Скрипт также создаст каталог проекта с файлом ansible.cfg
и файлом инвентаризации. Команда adhoc будет запущена как часть сценария для проверки подключения.
Внимание! Этот сценарий необходимо запустить вручную с узла контроллера после подготовки всех трех виртуальных машин.
Сборка установки Ansible Lab
Перейдите в каталог проекта и запустите команду «vagrant up», а обо всем остальном позаботятся скрипты vagrant и bootstrap.
cd Ansible_lab_vagrant_virtualbox
vagrant up
Пример вывода:
Bringing machine 'controller' up with 'virtualbox' provider…
Bringing machine 'm1' up with 'virtualbox' provider…
Bringing machine 'm2' up with 'virtualbox' provider…
………
Постинсталляционный скрипт
После подготовки всех трех виртуальных машин войдите на узел контроллера, чтобы запустить /home/vagrant/key_gen.sh
, чтобы создать пары ключей ssh, и подтвердите их, запустив специальную команду ansible.
vagrant ssh controller
cd /home/vagrant/
bash key_gen.sh
Keygen-скрипт
Vagrant команды для управления виртуальной машиной
Следующие команды помогут вам поддерживать жизненный цикл бродячих машин.
Чтобы начать сборку виртуальных машин, выполните следующую команду из каталога, где находится vagrantfile.
vagrant up
Если вы хотите запустить только один узел, вы можете добавить имя хоста в команду «vagrant up
».
vagrant up controller
Чтобы проверить состояние машины, выполните следующую команду.
vagrant status
Current machine states:
controller running (virtualbox)
m1 running (virtualbox)
m2 running (virtualbox)
Вы также можете использовать следующую команду, которая предоставит дополнительную информацию о виртуальной машине.
vagrant global-status --prune
name provider state directory
---------------------------------------------------------------------------------------------------------------------
6095cc7 controller virtualbox running /home/karthick/Karthick_Root/Work/Vagrant/Lab/Ansible_lab_vagrant_virtualbox
cf2e302 m1 virtualbox running /home/karthick/Karthick_Root/Work/Vagrant/Lab/Ansible_lab_vagrant_virtualbox
af10f7d m2 virtualbox running /home/karthick/Karthick_Root/Work/Vagrant/Lab/Ansible_lab_vagrant_virtualbox
Чтобы подключиться к виртуальной машине, вы можете запустить команду «vagrant ssh
». Вам необходимо передать имя виртуальной машины, иначе возникнет следующая ошибка.
vagrant ssh
This command requires a specific VM name to target in a multi-VM environment.
Чтобы подключиться к виртуальной машине m1 по ssh, команда будет такой:
vagrant ssh m1
Или,
vagrant ssh cf2e302
Вы также можете подключиться, используя имя пользователя и пароль, если включена аутентификация на основе пароля.
ssh vagrant@192.168.10.4
vagrant@192.168.10.4's password:
vagrant@managed1:~$
Чтобы остановить конкретную виртуальную машину, запустите команду остановки с именем виртуальной машины.
vagrant halt controller
Чтобы остановить все виртуальные машины, выполните следующую команду.
vagrant halt
==> m2: Attempting graceful shutdown of VM…
==> m1: Attempting graceful shutdown of VM…
==> controller: Attempting graceful shutdown of VM…
Чтобы уничтожить всю виртуальную машину, включая ее диск, выполните следующую команду.
vagrant destroy -f
==> m2: Destroying VM and associated drives…
==> m1: Destroying VM and associated drives…
==> controller: Destroying VM and associated drives…
Заключение
В этой статье я показал автоматизированный способ настройки ansible lab с использованием Vagrant и VirtualBox. Лаборатория создана с использованием стека Ubuntu 20.04 LTS.
Если вы планируете пройти сертификацию Ansible и хотите попрактиковаться в лаборатории, я предлагаю вам отредактировать файл vagrantfile, указав имя поля на вариант RHEL, и заменить команду apt
на соответствующую dnf
/yum
в файле bootstrap.sh
.
Читать далее:
- Файлы инвентаризации и конфигурации Ansible