Vagrant를 활용한 Ansible 실습 환경을 구성한다. Ubuntu와 Rocky Linux 기반의 멀티 노드 클러스터를 자동으로 배포할 수 있다.
전체 4대의 노드로 구성된다.
| Node | OS | Kernel | vCPU | Memory | Disk | NIC2 IP | 관리자 계정 | 일반 계정 |
|---|---|---|---|---|---|---|---|---|
| server | Ubuntu 24.04 | 6.8.0 | 2 | 1.5GB | 30GB | 10.10.1.10 | root / qwe123 | vagrant / qwe123 |
| tnode1 | Ubuntu 24.04 | 6.8.0 | 2 | 1.5GB | 30GB | 10.10.1.11 | root / qwe123 | vagrant / qwe123 |
| tnode2 | Ubuntu 24.04 | 6.8.0 | 2 | 1.5GB | 30GB | 10.10.1.12 | root / qwe123 | vagrant / qwe123 |
| tnode3 | Rocky Linux 9 | 5.14.0 | 2 | 1.5GB | 60GB | 10.10.1.13 | root / qwe123 | vagrant / qwe123 |

작업 디렉토리를 생성하고 필요한 파일들을 다운로드한다.
mkdir ansible
cd ansible
curl -O https://raw.githubusercontent.com/gasida/vagrant-lab/refs/heads/main/ansible/Vagrantfile
curl -O https://raw.githubusercontent.com/gasida/vagrant-lab/refs/heads/main/ansible/init_cfg.sh
curl -O https://raw.githubusercontent.com/gasida/vagrant-lab/refs/heads/main/ansible/init_cfg2.sh
vagrant up
##
...
==> tnode3: Configuring and enabling network interfaces...
==> tnode3: Running provisioner: shell...
tnode3: Running: /var/folders/v1/7xpv7bb566x_14r5wy8phf2c0000gn/T/vagrant-shell20260118-1659-ipsz6s.sh
tnode3: >>>> Initial Config Start <<<<
tnode3: [TASK 1] Setting Profile & Change Timezone
tnode3: [TASK 2] Disable firewalld and selinux
tnode3: [TASK 5] Install Packages
tnode3: [TASK 4] Config account & ssh config
tnode3: [TASK 5] Setting Local DNS Using Hosts file
tnode3: >>>> Initial Config End <<<<
riverjin@gangjin-ung-ui-Macmini ansible % vagrant status
Current machine states:
server running (virtualbox)
tnode1 running (virtualbox)
tnode2 running (virtualbox)
tnode3 running (virtualbox)
This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.
전체 노드 구성을 정의한다. Ubuntu 기반 Server 노드 1대, Test 노드 2대, Rocky Linux 기반 Test 노드 1대로 구성된다.
# Variables
N = 2
BOX_IMAGE = "bento/ubuntu-24.04"
BOX_VERSION = "202510.26.0"
Vagrant.configure("2") do |config|
# Server Node : Ubuntu
config.vm.define "server" do |subconfig|
subconfig.vm.box = BOX_IMAGE
subconfig.vm.box_version = BOX_VERSION
subconfig.vm.provider "virtualbox" do |vb|
vb.customize ["modifyvm", :id, "--groups", "/Ansible-Lab"]
vb.name = "server"
vb.cpus = 2
vb.memory = 1536
vb.linked_clone = true
end
subconfig.vm.host_name = "server"
subconfig.vm.network "private_network", ip: "10.10.1.10"
subconfig.vm.network "forwarded_port", guest: 22, host: 60000, auto_correct: true, id: "ssh"
subconfig.vm.synced_folder "./", "/vagrant", disabled: true
subconfig.vm.provision "shell", path: "init_cfg.sh"
end
# Test Node : Ubuntu
(1..N).each do |i|
config.vm.define "tnode#{i}" do |subconfig|
subconfig.vm.box = BOX_IMAGE
subconfig.vm.box_version = BOX_VERSION
subconfig.vm.provider "virtualbox" do |vb|
vb.customize ["modifyvm", :id, "--groups", "/Ansible-Lab"]
vb.name = "tnode#{i}"
vb.cpus = 2
vb.memory = 1536
vb.linked_clone = true
end
subconfig.vm.host_name = "tnode#{i}"
subconfig.vm.network "private_network", ip: "10.10.1.1#{i}"
subconfig.vm.network "forwarded_port", guest: 22, host: "6000#{i}", auto_correct: true, id: "ssh"
subconfig.vm.synced_folder "./", "/vagrant", disabled: true
subconfig.vm.provision "shell", path: "init_cfg.sh", args: [ N ]
end
end
# Test Node : Rocky Linux
config.vm.define "tnode3" do |subconfig|
subconfig.vm.box = "bento/rockylinux-9"
subconfig.vm.box_version = "202510.26.0"
subconfig.vm.provider "virtualbox" do |vb|
vb.customize ["modifyvm", :id, "--groups", "/Ansible-Lab"]
vb.name = "tnode3"
vb.cpus = 2
vb.memory = 1536
vb.linked_clone = true
end
subconfig.vm.host_name = "tnode3"
subconfig.vm.network "private_network", ip: "10.10.1.13"
subconfig.vm.network "forwarded_port", guest: 22, host: 60003, auto_correct: true, id: "ssh"
subconfig.vm.synced_folder "./", "/vagrant", disabled: true
subconfig.vm.provision "shell", path: "init_cfg2.sh"
end
end
Ubuntu 노드의 기본 설정을 자동화한다.
#!/usr/bin/env bash
echo ">>>> Initial Config Start <<<<"
echo "[TASK 1] Setting Profile & Change Timezone"
echo 'alias vi=vim' >> /etc/profile
echo "sudo su -" >> /home/vagrant/.bashrc
ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
echo "[TASK 2] Disable AppArmor"
systemctl stop ufw && systemctl disable ufw >/dev/null 2>&1
systemctl stop apparmor && systemctl disable apparmor >/dev/null 2>&1
echo "[TASK 3] Install Packages"
apt update -qq >/dev/null 2>&1
apt-get install tree sshpass unzip -y -qq >/dev/null 2>&1
echo "[TASK 4] Config account & ssh config"
echo 'vagrant:qwe123' | chpasswd
echo 'root:qwe123' | chpasswd
sed -i "s/^#PasswordAuthentication yes/PasswordAuthentication yes/g" /etc/ssh/sshd_config
sed -i "s/^#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config
systemctl restart ssh
echo "[TASK 5] Setting Local DNS Using Hosts file"
sed -i '/^127\.0\.\(1\|2\)\.1/d' /etc/hosts
cat << EOF >> /etc/hosts
10.10.1.10 server
10.10.1.11 tnode1
10.10.1.12 tnode2
10.10.1.13 tnode3
EOF
echo ">>>> Initial Config End <<<<"
Rocky Linux 노드의 기본 설정을 자동화한다.
#!/usr/bin/env bash
echo ">>>> Initial Config Start <<<<"
echo "[TASK 1] Setting Profile & Change Timezone"
echo 'alias vi=vim' >> /etc/profile
echo "sudo su -" >> /home/vagrant/.bashrc
ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
echo "[TASK 2] Disable firewalld and selinux"
systemctl stop firewalld && systemctl disable firewalld >/dev/null 2>&1
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
echo "[TASK 3] Install Packages"
dnf install -y yum sshpass jq git >/dev/null 2>&1
echo "[TASK 4] Config account & ssh config"
echo 'vagrant:qwe123' | chpasswd
echo 'root:qwe123' | chpasswd
sed -i "s/^#PasswordAuthentication yes/PasswordAuthentication yes/g" /etc/ssh/sshd_config
sed -i "s/^#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config
systemctl restart sshd
echo "[TASK 5] Setting Local DNS Using Hosts file"
sed -i '/^127\.0\.\(1\|2\)\.1/d' /etc/hosts
cat << EOF >> /etc/hosts
10.10.1.10 server
10.10.1.11 tnode1
10.10.1.12 tnode2
10.10.1.13 tnode3
EOF
echo ">>>> Initial Config End <<<<"
Server 노드에 접속하여 환경을 확인한다.
vagrant ssh server
시스템 기본 정보를 체크한다.
# 계정 정보 확인
whoami
##실행 결과
root
id
##실행 결과
uid=0(root) gid=0(root) groups=0(root)
# Kernel, CPU, Mem, Disk, NIC 확인
uname -r
##실행 결과
6.8.0-86-generic
hostnamectl
##실행 결과
Static hostname: server
Icon name: computer
Machine ID: 4a2a90be10e442b29f0b95311bb71555
Boot ID: 1ed5eb212ed5438b93d0a68c92651a1f
Operating System: Ubuntu 24.04.3 LTS
Kernel: Linux 6.8.0-86-generic
Architecture: arm64
htop
##실행 결과
free -h
lsblk
df -hT /
ip -c addr
# /etc/hosts 확인
cat /etc/hosts
##실행 결과
..
10.10.1.10 server
10.10.1.11 tnode1
10.10.1.12 tnode2
10.10.1.13 tnode3
# 노드간 통신 확인
for i in {1..3}; do ping -c 1 tnode$i; done
##실행 결과
...
64 bytes from tnode1 (10.10.1.11): icmp_seq=1 ttl=64 time=1.12 ms
--- tnode1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.123/1.123/1.123/0.000 ms
PING tnode2 (10.10.1.12) 56(84) bytes of data.
64 bytes from tnode2 (10.10.1.12): icmp_seq=1 ttl=64 time=0.880 ms
--- tnode2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.880/0.880/0.880/0.000 ms
PING tnode3 (10.10.1.13) 56(84) bytes of data.
64 bytes from tnode3 (10.10.1.13): icmp_seq=1 ttl=64 time=0.765 ms
--- tnode3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.765/0.765/0.765/0.000 ms
모든 노드가 정상적으로 통신되면 Ansible 실습 환경 구성이 완료된다.