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.com | 192.168.10.3 | ubuntu/focal64 |
托管节点 | managed1.anslab.com | 192.168.10.4 | ubuntu/focal64 |
托管节点 | managed2.anslab.com | 192.168.10.5 | ubuntu/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 中突出显示的参数。
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
文件。
阅读下一篇:
- Ansible 清单和配置文件
AnsibleAnsible 实验室设置ContainersDevOpsIT 自动化LinuxLinux 管理Linux ContainersSetup Ansible LabVagrantVirtualBoxVirtualization