Поиск по сайту:

Настройка 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 TYPENODE NAMEIP ADDRESSOS FLAVOR
Control Nodecontroller.anslab.com192.168.10.3ubuntu/focal64
Managed Nodemanaged1.anslab.com192.168.10.4ubuntu/focal64
Managed Nodemanaged2.anslab.com192.168.10.5ubuntu/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

Статьи по данной тематике