在 Linux 中使用 Vagrant 和 Virtualbox 进行自动化 Ansible 实验室设置

Ansible 是一个用于编排、配置管理、部署、配置等领域的自动化平台。如果您是想学习 ansible 的初学者或计划参加 ansible 认证的人,那么您需要有一个家庭实验室设置来练习 ansible . 手动设置家庭实验室是一项耗时的任务。 有几个自动化解决方案,例如 码头工人, 流浪汉, Cloud 可用于构建 ansible 实验室的解决方案。 在本指南中,我们将学习使用 Vagrant 和 VirtualBox 在 Linux 中。

Vagrant 是快速设置开发环境的绝佳工具。 如果你是 vagrant 新手,我建议你看看我们的 Vagrant 指南介绍。

  • Vagrant 教程 – 在 Linux 中开始使用 Vagrant

出于本指南的目的,我们将使用 Vagrant VirtualBox 作为提供者来建立我们的 ansible 实验室。 您也可以使用 KVM 代替 VirtualBox. 如果您希望使用 KVM 作为提供程序,请参阅下面有关怎样将 vagrant 与 KVM 一起使用的文章。

  • 怎样通过 Libvirt KVM Provider 使用 Vagrant

Ansible 实验室设置

作为先决条件,您需要在 Linux 机器上安装 Vagrant 和 Virtualbox。 如果您还没有安装 Vagrant,请参考以下指南在不同的 Linux 发行版上安装 Vagrant。

  • 怎样在 Linux 上安装 Vagrant

我们将构建一个三节点的 ansible 实验室设置。 一个节点将充当主/控制器节点,两个节点将充当受管节点。 出于演示目的,我正在使用 ubuntu/focal64 流浪盒子。

这是我的 Ansible 实验室设置的详细信息。

节点类型节点名称IP地址操作系统风味
控制节点控制器.anslab.com192.168.10.3ubuntu/focal64
托管节点managed1.anslab.com192.168.10.4ubuntu/focal64
托管节点managed2.anslab.com192.168.10.5ubuntu/focal64

三节点 Ansible 实验室设置

这里我只为我的实验室设置了三个节点,但是您可以在设置自己的实验室时添加任意数量的托管节点。

克隆项目存储库

我已经在我的 GitHub 存储库中托管了设置 Ansible 实验室所需的所有文件。 运行以下命令以在本地克隆存储库。

$ git clone --recursive https://github.com/KarthickSudhakar/Ansible_lab_vagrant_virtualbox.git

让我们在项目目录中导航以查看存在哪些文件。

项目结构

让我简单介绍一下每个文件。

1.流浪文件

所有与 VM 相关的配置都存储在此文件中。 这是这个文件的内容。

# -*- 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

这是一个shell脚本,负责在控制器节点中设置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 controllern192.168.10.4 managed1.anslab.com managed1n192.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

一旦完成所有三个 VM 构建,应手动触发此脚本。 该脚本将负责生成 ssh 密钥对,并将其分发到所有三个节点。 它还将运行一个示例 ansible ad-hoc 命令进行验证。

该文件的内容如下:

#!/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" [email protected]$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 "controllernn[ubuntu1]nmanaged1nn[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 和 shell 脚本中的配置。

1.内存和Vcore分配

对于所有三个 vagrant box,我们需要设置内存和 CPU 值。 这里内存设置为 2GB CPU设置为 2. 如果您想增加或减少限制,只需调整 Vagrantfile 中突出显示的参数。

内存和Vcore

2.操作系统风味

所有三个节点(控制器和托管)都使用 Ubuntu 20.04 LTS 映像。 所以当你运行“vagrant up” 命令 vagrant 将查找以下参数,如果本地不可用,则尝试拉取图像。

操作系统风味 操作系统风味

3.网络设置

默认情况下,vagrant 在第一个接口(适配器 1)使用 NAT。 Vagrant 使用 NAT 上的端口转发连接到虚拟机。 在这里,我们通过专用网络为所有三个 VM 设置主机名和静态 IP 地址。

将创建一个单独的接口 (Adapter2) 并为其分配静态 IP 地址。 作为专用网络一部分的 VM 可以相互通信。

在多虚拟机环境下,vagrant 会自动修复端口冲突。

==> 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 默认情况下在 vm 中配置的权限。

默认情况下,VM 禁用基于密码的身份验证。 Vagrant 将创建一个 ssh 密钥对,并在您运行“vagrant ssh“ 命令。

$ vagrant ssh controller
$ vagrant ssh m1
$ vagrant ssh m2

基于密码的身份验证通过 bootstrap.sh 文件,以便您可以使用 IP 地址和基于密码的身份验证而不是基于密钥的身份验证连接到节点。

5. 引导脚本

脚本 bootstrap.sh 负责

  • 启用基于密码的身份验证。
  • 创建一个 .huhlogin 文件以抑制默认横幅消息。
  • 将主机条目添加到 /etc/hosts 三个节点的文件。
  • 安装所需的软件包。
  • 仅在控制器节点上通过 python 包管理器(pip)安装 ansible。

我正在使用 shell 配置程序,其中 bootstrap.sh 将被复制到 /tmp/ 在所有三个 VM 中的位置,脚本将以 root 权限运行。

外壳供应商 外壳供应商

小心: 如果您正在构建一个基于 RHEL 的实验室,您应该从 bootstrap.sh 根据文件 dnf 要么 rpm. 所有发行版的其余部分都将相似。

6. 生成密钥对

Ansible 使用 SSH 密钥对与受管节点通信并运行任务。 应该从控制器节点生成新密钥并与所有托管节点共享,以便 ansible 可以与托管节点通信,而无需每次都提示输入密码。

剧本 key_gen.sh 将负责创建 ssh 密钥并将密钥分发给所有节点。 该脚本还将创建一个项目目录 ansible.cfg 文件和库存文件。 这 特设 命令将作为脚本的一部分触发以验证连接性。

小心: 一旦配置了所有三个 VM,就必须从控制器节点手动触发此脚本。

构建 Ansible 实验室设置

转到项目目录并运行“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…
………

安装后脚本

配置所有三个 VM 后,登录到控制器节点以运行 /home/vagrant/key_gen.sh 创建 ssh 密钥对并通过运行 ansible ad-hoc 命令进行验证。

$ vagrant ssh controller
$ cd /home/vagrant/
$ bash key_gen.sh
注册机脚本 注册机脚本

管理 VM 的 Vagrant 命令

以下命令将帮助您维护 vagrant 机器的生命周期。

要开始构建虚拟机,请从 vagrantfile 所在的目录运行以下命令。

$ vagrant up

如果您只想启动一个节点,则可以将主机名添加到“vagrant up“ 命令。

$ vagrant up controller

要检查机器状态,请运行以下命令。

$ vagrant status
Current machine states:

controller running (virtualbox)
m1 running (virtualbox)
m2 running (virtualbox)

您还可以使用以下命令,该命令将提供有关 VM 的更多信息。

$ 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.

要 ssh 进入 m1 虚拟机,命令是:

$ vagrant ssh m1

要么,

$ vagrant ssh cf2e302

如果启用了基于密码的身份验证,您还可以使用用户名和密码进行连接。

$ ssh [email protected]
[email protected]'s password:
[email protected]:~$

要停止特定的虚拟机,请使用 vm 名称运行 halt 命令。

$ vagrant halt controller

要停止所有虚拟机,请运行以下命令。

$ vagrant halt
==> m2: Attempting graceful shutdown of VM…
==> m1: Attempting graceful shutdown of VM…
==> controller: Attempting graceful shutdown of VM…

要销毁包括其磁盘在内的所有 vm,请运行以下命令。

$ vagrant destroy -f
==> m2: Destroying VM and associated drives…
==> m1: Destroying VM and associated drives…
==> controller: Destroying VM and associated drives…

结论

在本文中,我展示了使用 Vagrant 和 VirtualBox. 该实验室是使用 Ubuntu 20.04 LTS 堆栈创建的。

如果您打算进行 ansible 认证并希望在实验室进行练习,我建议您编辑 vagrantfile 将框名称指向 RHEL 风格并替换 apt 命令适当 dnf/yum 命令在 bootstrap.sh 文件。