본문 바로가기

Automation/system

[자동화] AI 개발환경 구축기 #1-가상환경 만들기(VirtualBox & Vagrant)

머신러닝과 딥러닝, 그리 AI(인공지능)!!!

AI 서비스를 개발하기 위한 환경을 만들어본다.

최종 목표는 Kubeflow 기반의 AutoML 환경 구성이고, IaC(Infra as Code) 기반으로 Automation 하는것이 목적이다.

 

 

1편 "가상환경 만들기" 호스트 서버 구성

  • 호스트 OS :  Ubuntu 20.04 LTS
  • 호스트 서버 : Intel i7-10700, 16GiB DDR4, 1TB SSD, 10TB HDD
  • 가상화(Virtualization) 도구 : Virtualbox 6.1
  • 프로비저닝(Provisioning) 도구 : Vagrant 2.2.14
  • IaC(Infra as Code) : Ansible 2.5.1
가. Ubuntu 설치

Ubuntu 20.04를 설치한다. (설치방법 생략)

 

나. VirtualBox 설치

버추얼박스(이하 VBox)는 Oracle에서 제공하는 Repository를 이용하여 설치한다.

apt로 설치하면 간편하긴하지만 버전을 지정할 수 없다.

Oracle Site에서 직접 원하는 버전을 다운로드해서 설치할 수도 있으나, 자동 업데이트가 안되는 문제가 있다. 

 

1. Oracle Repository 등록

sudo sh -c 'echo "deb [arch=amd64] https://download.virtualbox.org/virtualbox/debian $(lsb_release -sc) contrib" >> /etc/apt/sources.list.d/virtualbox.list'

 

2. VBox 다운로드

sudo apt update
sudo apt upgrade

# VBox 설치 파일을 다운로드할 경로
cd ~/download

sudo wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
sudo wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
sudo apt update

3. VBox 설치

sudo apt install virtualbox-6.1

# VBox Extension 설치(추가)
sudo wget https://download.virtualbox.org/virtualbox/6.1.8/Oracle_VM_VirtualBox_Extension_Pack-6.1.8.vbox-extpack 
sudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-6.1.8.vbox-extpack

[참고] VboxManage extpack 설치할 때 라이센스 이용 약관이 표시되면 "동의", "Y"를 입력할 것

[참고] VBox 제거 : sudo apt remove virtualbox virtualbox-*

 

다. Vagrant 설치

Vagrant는 HashiCorp에서 만든 Provisioning 도구이다.

VBox를 이용하여 가상머신을 자동으로 생성할 수 있을 뿐만 아니라, 기본적으로 필요한 서버의 셋팅도 자동화할 수 있다.

 

1. Vagrant 설치

# 다운로드할 경로로 이동
cd ~/download 

curl -O https://releases.hashicorp.com/vagrant/2.2.14/vagrant_2.2.14_x86_64.deb
sudo apt install ./vagrant_2.2.14_x86_64.deb

# 버추얼박스 Plugin 설치
vagrant plugin install vagrant-vbguest

[참고] 설치 확인 : vagrant --version

 

라. Ansible 환경 구축

Vagrant를 이용하여 Ubuntu Guest 머신을 생성하고, Ansible 서버를 설치한다.

이제 부터 Vagrant로 가상머신(이하 VM)을 만들고 지우는 작업을 반복해야하고, 또 많은 VM을 한번에 생성해야할 수 있기 때문에 별도의 작업공간을 설정하는 것이 좋다.

 

나는 /work 경로에 4TB의 디스크파티션을 할당했고, 사용자 계정 권한을 부여했다.(예: chwon [계정명]:[그룹명] /work) 

 

1. Vagrantfile 생성

# 작업 디렉토리 생성 및 이동
mkdir /work/vagrant/ansible
cd /work/vagrant/ansible

vagrant init

"vagrant init" 명령을 수행하면 "Vagrantfile"이 생성된다.

Vagrantfile을 수정하여 ansible-server를 구성한다.

 

2. Vagrantfile 수정 - Ansible Master Server 생성

# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    #ansible-server 설치
    config.vm.define "ansible-server" do |cfg|
        cfg.vm.box = "ubuntu/bionic64"
        cfg.vm.provider "virtualbox" do |vb|
            vb.name = "ansible-server"
        end

        cfg.vm.host_name = "ansible-server"
        cfg.vm.network "public_network", ip: "192.168.1.11"
        cfg.vm.network:forwarded_port, host: 61122, guest: 22, auto_correct: true, id: "ssh"
        cfg.vm.synced_folder "../shared_data", "/shared_data", disabled: true
        cfg.vm.provision:shell, inline: "apt-get update -y"
        cfg.vm.provision:shell, inline: "apt-get install ansible -y"
        cfg.vm.provision:shell, path: "bootstrap.sh"
    end
end

우선 서버 한대를 Ansible Master Server로 생성한다.

Ansible Master Server 를 포함하여 Ansible Worker Server(멤버들) 들이 계속 추가될 것이고, 모든 서버에 동일한 환경을 구성하기 위해 서버 기동 시 적용할 "bootsrap.sh"를 작성해서 적용한다.

 

[주요내용]

  • cfg.vm.box = "ubuntu/bionic64" : 우분투 18.04 Vagrant Box 사용 (우분투 20.04 Box를 사용하려면 "ubuntu/focal64")
  • cfg.vm.provider "virtualbox" : 가상화 도구로 VBox 사용
  • cfg.network "public_network", ip: [가상머신IP] : BridgeAdapter Network을 구성, NAT를 통한 외부망 연결 가능, IP는 NAT 영역과 충돌하지 않도록 다른 영역의 CIDR 사용할 것. (예: NAT=10.0.2.0/24, Bridge=192.168.1.0/24)
  • cfg.network:forwarded_port : "SSH" 포트 포워딩 적용(guest=VM, host=로컬서버를 의미함, 즉 서버 '61122' 포트를 VM '22' 포트로 포워딩)
  • cfg.vm.provision:shell, inline: "..." : VM내에서 쉘 명령 실행
  • cfg.vm.provision:shell, path: "..." : path 경로에 있는 쉘 스크립트 파일 실행

[참고URL]

 

Vagrant Cloud by HashiCorp

Vagrant Cloud by HashiCorp

app.vagrantup.com

3. bootstrap.sh 작성

VBox, Vagrant, Ansible 등 다양한 프로비저닝 자동화 도구를 사용하는 이유는 "Script"와 "Template"을 이용하여 다수의 서버를 핸들링하기 위함이다. 개발을 위해서든 운영을 위해서든 단독서버 보다는 여러 서버를 사용하는 경우가 많을 것이고, 각 서버들은 계정, 디스크, 보안 등 공통적인 관리 항목이 존재한다. 자동 프로비저닝을 사용하면 필요한 서버를 원하는 시기에 원하는 형태로 만들 수 있다. 

bootstrap.sh 스크립트를 작성하여 서버의 기본 설정을 구현한다.

#! /bin/bash

# 모든 멤버(서버)를 대상으로 공통사항을 설정하거나 필요한 유틸을 설치

# Ansible 은 Server(마스터)와 Clients(멤버들)로 구성됨.
# 마스터 서버와 멤버들의 설정이 다를 수 있으므로 host_name 구분을 위해 사용
MASTER_NAME="ansible-server"
HOST_NAME=$HOSTNAME

step=1

# 공통 설정 단계와 단계 별 안내 메세지 출력
print_step() {
    echo "STEP $step $1"
    step=$((step+1))
}

# 모든 서버의 공통사항 설정
setup_env() {
    print_step "###===== Initialize Evironment =====###"

    apt-get update -y
    apt-get install -y net-tools
    
    # /etc/hosts 파일에 멤버들을 등록
    setup_hosts

    # SSH 접속 환경 설치
    setup_ssh
    setup_root_login

    # Master, Worker에 따라 달라지는 설정 적용
    if [ $MASTER_NAME = $HOSTNAME ]
    then
        setup_master
    else
        setup_worker
    fi
}

# Master 설정
setup_master() {
    print_step "###===== Initialize Master : Ansible Server =====###"

    # 멱등성의 문제 고려
    # (주의) Ansible의 설정을 bootstrap에서 설정할 경우 반복 실행 시 내용이 중복될 수 있음
    # 예: /etc/ansible/hosts 파일 수정 등
    # 멱등성을 고려하여 Ansible을 위해 필요한 고유 설정은 ansible 기능을 사용하는 것이 좋음

    #echo "[webservice]" >> /etc/ansible/hosts
    #echo "ansible-client01" >> /etc/ansible/hosts
}

# Worker 설정
setup_worker() {
    print_step "###===== Initialize Worker =====###"
}

# 호스트 도메인 등록 : /etc/hosts
setup_hosts() {
    print_step "###===== Setup /etc/hosts =====###"

    ADD_HOSTS = $(grep "bootstrap" /etc/hosts)

    # /etc/hosts 파일 중복 작성 방지
    if [[ -z $ADD_HOSTS ]]
    then
        echo "192.168.1.11 ansible-server" >> /etc/hosts
        echo "192.168.1.12 ansible-client-01" >> /etc/hosts
    fi
}

# SSH 환경 설정
setup_ssh() {
    print_step "###===== Install OpenSSH =====###"

    apt-get update -y
    apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
    apt-get install -y openssh-server
    apt-get install -y ssh

    service ssh enable
    #systemctl enable ssh
    service ssh start

    print_step "###===== Setup SSH Authentication without password input =====###"
   
    # 비밀번호 입력 없이 SSH Connection 
    apt-get install -y sshpass
    sed -i -e 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
    service ssh restart
}

# Root 계정 활성화
setup_root_login() {
    print_step "###===== Enalbe Root Setup =====###"

    sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
    service ssh restart
    echo "root:rootroot" | chpasswd
}

# 멤버 접속 시 웰컴 메세지 출력
print_welcome_cow() {
    print_step "###===== Create Welcome Message =====###"

    WELCOME=$(grep "Welcome" /home/vagrant/.bashrc)

    # $WELCOME 의 문자열 길이가 '0' 이면
    # 메세지 중복 방지
    if [[ -z $WELCOME ]]
    then
        apt-get install -y cowsay
        echo -e "\necho \"Welcome to Ubuntu 18 .04, VM Vagrant\" | cowsay\n" >> /home/vagrant/.bashrc          ln -s /usr/games/cowsay /usr/local/bin/cowsay
    fi
}

main() {
    setup_env
    print_welcome_cow
}

main

 

4. 가상 서버 생성 - Provisioning

Vagrantfile을 실행하면 추가한 머신(ansible-server)이 VBox에 생성된다.

 

# 머신 생성을 위한 베이그런트 실행
vagrant up

# 버추얼박스 실행, 확인
virtualbox &

# 생성한 Guest 머신 접속
vagrant ssh

[Vagrant 명령어 참고]

  • vagrant init : 베이그런트 환경 초기화
  • vagrant up : Vagrantfile 내용 최초 실행
  • vagrant reload --provision : VM 재실행 및 새로운 프로비저닝 설정 적용
  • vagrant halt : VM 실행 중지
  • vagrant status : 프로비저닝된 VM 리스트 및 상태확인

Vagrantfile에 서버를 새로 추가했다면 vagrant up 명령을 사요하면 되고, 기존 서버의 설정을 변경하거나 추가했다면 vagrant reload --provision 명령을 사용하면 된다.


기본적인 서버(가상서버)의 프로비저닝 환경을 만들었다.

Vagrant와 VBox만으로도 상당히 편리한 Infra 관리 자동화가 가능하다.

하지만 애플리케이션 개발을 위해서는 WEB, WAS, DB 등 Middleware 환경을 구성해야하고, Application Runtime을 위한 의존성 라이브러리 관리, 소스관리, 배포환경 등 다양한 환경 구성이 필요하다.

인공지능 서비스 개발을 위한 개발환경 역시 머신러닝, 딥러닝을 위한 Model 생성, Traning, Validation, Production 등 Pipeline 환경 구성이 필수적이다.

이를 위한 다양한 SW를 일일히 설치하고, 기존 설정을 변경하거나 추가하는 것은 매우 어렵고, 시간이 많이 드는 작업이다. 이런 작업을 자동화할 수 있도록 Infra as Code(IaC) 적용이 필요하다.

 

Ansible을 이용하여 IaC 자동화 환경을 만들고, AI 서비스 개발에 필요한 환경을 쉽게 관리할 수 있도록 Automation 작업을 계속 해보자.

 

AI 개발환경 구축기 #2-IaC Automation(Ansible)

 

AI 개발환경 구축기 #2-IaC Automation(Ansible)

"작성중" 머신러닝과 딥러닝, 그리 AI(인공지능)!!! AI 서비스를 개발하기 위한 환경을 만들어본다. 최종 목표는 Kubeflow 기반의 AutoML 환경 구성이고, IaC(Infra as Code) 기반으로 Automation 하는것이 목적

jarikki.tistory.com