일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 컨테이너
- db
- Router
- snort
- programmers
- 코딩테스트
- 라우팅
- Cosmos
- 라우터
- 도커
- 스노트 룰
- osi7layer
- Container
- Python
- MySQL
- docker
- 스노트
- coding test
- database
- 라우팅프로토콜
- 리눅스
- 데이터베이스
- 코딩 테스트
- 트레바리
- 프로그래머스
- Routing
- OSI7계층
- Snort Rule
- Linux
- TDD
- Today
- Total
Simple is IT, 누구나 보고 누구나 깨닫는 IT
Vagrant, Ansible을 이용해 간단하게 서버 관리하기 본문
이번 포스팅은 인프라를 좀 더 쉽고 재밌고 간단하게 관리할 수 있는 자동화 툴. 그 툴을 이용해 서버를 좀 더 간단하고 효율적으로 관리할 수 있다는 것을 깨닫는게 목표에요.
필요한 도구들의 리스트입니다. 설치가 필요하다면 링크를 걸어두었으니 클릭하세요!
Ansible에 대해서 설명을 해드릴게요!
Ansible은 인프라 구성을 코드를 이용해 자동화로 구성하는 도구에요. 아주 간편하고 매력있기도 해서 많은 IT인 들에게 사랑받고 있는 도구랍니다. SSH 연결을 기반으로 하기 때문에 Ansible이 설치되어 있는 서버가 있다면 클라이언트는 따로 설치가 필요하지 않아요.
더 많은 설명이 필요하시다면 아래 링크를 클릭해주세요.
Vagrant에 대해서 설명을 해드릴게요!
Vagrant는 가상 머신(Virtual Machine)들을 아주 쉽고 효율적으로 관리하도록 도와주는 툴이에요. 우리가 가상머신에 대해 원하는 자원을 할당, 배치, 배포해 두었다 필요할 때 시스템을 사용할 수 있도록 만들어주는 도구죠. 정말 매력있는 아이템 중에 하나에요. (프로비저닝 도구라고도 해요)
Virtualbox에 대해서... 괜찮겠죠?
1. 가상머신 생성_Vagrant
설치한 환경에서 커맨드로 입력해주세요.
vagrant init ubuntu/xenial64
이미지는 'ubuntu:16.04_xenial'을 사용했어요. 위 명령어를 입력하면 현재 디렉토리에 'Vagrantfile' 파일이 생성된답니다.
'Vagrantfile'은 Vagrant를 이용해 머신을 생성할 때 참조하는 'Code'형식의 매뉴얼이라고 생각하면 좋아요.
Vagrantfile 파일의 내용을 살펴볼게요.
# -*- 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.
Vagrant.configure("2") do |config|
# The most common configuration options are documented and commented below.
# For a complete reference, please see the online documentation at
# https://docs.vagrantup.com.
# Every Vagrant development environment requires a box. You can search for
# boxes at https://vagrantcloud.com/search.
config.vm.box = "ubuntu/xenial64"
# Disable automatic box update checking. If you disable this, then
# boxes will only be checked for updates when the user runs
# `vagrant box outdated`. This is not recommended.
# config.vm.box_check_update = false
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
# NOTE: This will enable public access to the opened port
# config.vm.network "forwarded_port", guest: 80, host: 8080
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine and only allow access
# via 127.0.0.1 to disable public access
# config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
# Create a private network, which allows host-only access to the machine
# using a specific IP.
# config.vm.network "private_network", ip: "192.168.33.10"
# Create a public network, which generally matched to bridged network.
# Bridged networks make the machine appear as another physical device on
# your network.
# config.vm.network "public_network"
# Share an additional folder to the guest VM. The first argument is
# the path on the host to the actual folder. The second argument is
# the path on the guest to mount the folder. And the optional third
# argument is a set of non-required options.
# config.vm.synced_folder "../data", "/vagrant_data"
# Provider-specific configuration so you can fine-tune various
# backing providers for Vagrant. These expose provider-specific options.
# Example for VirtualBox:
#
# config.vm.provider "virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
# vb.memory = "1024"
# end
#
# View the documentation for the provider you are using for more
# information on available options.
# Enable provisioning with a shell script. Additional provisioners such as
# Ansible, Chef, Docker, Puppet and Salt are also available. Please see the
# documentation for more information about their specific syntax and use.
# config.vm.provision "shell", inline: <<-SHELL
# apt-get update
# apt-get install -y apache2
# SHELL
end
ruby언어 기반으로 만들어진 파일이며 대부분 주석처리로 된 코드네요.
필요한 내용들은 주석을 해제하고 사용하시면 돼요.
주석처리 된 내용을 제외하면 이렇습니다. 한 눈에 봐도 딱 알 수 있겠군요!
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config| # Vagrant Version 2를 사용하겠다는 의미에요.
config.vm.box = "ubuntu/xenial64" # VirtualBOX에서 생성하는 머신의 이미지는 ubuntu에요.
end
'Vagrantfile'에서 필요한 내용들을 추가한 후 머신을 생성해볼게요.
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.define "ansible" do |cfg|
cfg.vm.box = "ubuntu/xenial64"
cfg.vm.provider "virtualbox" do |vb|
vb.name="ansible"
end
cfg.vm.host_name = "ansible"
cfg.vm.network "public_network", ip: "192.168.10.10"
cfg.vm.network "forwarded_port", guest: 22, host: 60022, auto_correct: true, id: "ssh"
cfg.vm.provision "shell", inline: "apt-get update -y"
cfg.vm.provision "shell", inline: "apt-get install ansible -y"
end
end
VirtualBOX에서 'ansible'이라는 이름의 가상머신을 생성하고 'ubuntu:16.04' 이미지를 이용해요. 해당 머신의 내부 IP는 '192.168.10.10', 내부 22번 포트는 제 호스트의 60022번 포트와 맵핑되었어요.
가상머신에서 'apt-get update -y', 'apt-get install ansible -y'명령을 입력해 저장소 업데이트 후 ansible 패키지를 설치해요.
파일이 작성되었으면 'vagrant up'명령을 실행해주세요.
vagrant up
얼마 지나지 않아 원하던 머신이 생성되었어요! 자원에 대한 값들은 기본값으로 설정되어있는 모습이네요.
vagrant로 생성한 가상머신에 ssh로 원격 접속하는 명령이에요. 들어가볼까요?
vagrant ssh
너무나도 간단하게 접속이 됩니다.
▼ 이 외에도 Vagrant를 다루기 위한 주요 명령어는 아래 정리해놓았어요.
Vagrant 관련 주요 명령어
vagrant help : 명령어 도움말
vagrant up : Vagrantfile 참조 후 가상머신 생성
vagrant halt : 가상머신 종료
vagrant destroy : 가상머신 종료 후 삭제
vagrant reload : 가상머신 재시작
vagrant ssh : 생성한 가상머신의 원격 접속
정말 간편한 도구인 것 같아요!
2. Docker 환경 구성_Ansible
Ansible이 설치된 가상머신에서 Ansible을 이용해 Docker 환경을 구성해볼게요!
첫 번째로 아래 명령어를 이용해 Docker를 설치할 수 있는 ansible playbook을 얻을 수 있어요.
git clone https://github.com/do-community/ansible-playbooks.git
cd ansible-playbooks
받은 파일에서 확인할 수 있습니다. 'docker_ubuntu1804'
docker_ubuntu1804/
├── playbook.yml
├── readme.md
└── vars
└── default.yml
▼ 세 파일이 보이네요. 각각의 설명들을 적어놨습니다!
playbook.yml : playbook 파일이에요. 원격 서버에 접속해 작업하는 설정을 포함하죠!
default.yml : playbook 셋팅을 커스텀하기 위한 변수를 설정
readme.md : read me! 읽어달라네요. playbook을 설정할 때 참고하는 설명서?에요.
vars/default.yml
---
create_containers: 4
default_container_name: docker
default_container_image: ubuntu
default_container_command: sleep 1d
##### 순서대로
# 생성하는 컨테이너의 수
# 컨테이너의 이름
# 컨테이너에 사용되는 이미지
# 생성한 컨테이너에서 실행할 명령
playbook.yml
#################################################
# DO Community Playbooks: Docker
#################################################
---
- hosts: all
become: true
vars_files:
- vars/default.yml
tasks:
- name: Install aptitude using apt
apt: name=aptitude state=latest update_cache=yes force_apt_get=yes
- name: Install required system packages
apt: name={{ item }} state=latest update_cache=yes
loop: [ 'apt-transport-https', 'ca-certificates', 'curl', 'software-properties-common', 'python3-pip', 'virtualenv', 'python3-setuptools']
- name: Add Docker GPG apt Key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: Add Docker Repository
apt_repository:
repo: deb https://download.docker.com/linux/ubuntu bionic stable
state: present
- name: Update apt and install docker-ce
apt: update_cache=yes name=docker-ce state=latest
- name: Install Docker Module for Python
pip:
name: docker
- name: Pull default Docker image
docker_image:
name: "{{ default_container_image }}"
source: pull
# Creates the number of containers defined by the variable create_containers, using values from vars file
- name: Create default containers
docker_container:
name: "{{ default_container_name }}{{ item }}"
image: "{{ default_container_image }}"
command: "{{ default_container_command }}"
state: present
with_sequence: count={{ create_containers }}
아래는 필요에 맞게 수정한 playbook이죠. playbook은 여기를 참고했어요.
---
- hosts: all
become: yes
vars:
admin_id: vagrant
distro_codename: bionic
# hosts: all 모든 호스트가 작업을 해요.
# become: yes 모든 명령이 sudo를 사용하게 돼요.
# 제 계정은 vagrant이기 때문에 썼고, bionic은 우분투 18:04이기 때문에 썼어요.
tasks:
- name: Update repositories cahce and install
apt:
pkg:
- apt-transport-https
- ca-certificates
- curl
- software-properties-common
update_cache: yes
# apt모듈에서 pkg, update_cache 인자를 사용했어요.
# 각 모듈에 대한 설명은 공식문서에 자세히 나와있답니다!
- name: Add Docker GPG apt Key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: Add Docker Repository
apt_repository:
repo: "deb https://download.docker.com/linux/ubuntu {{ distro_codename }} stable"
state: present
- name: Install Docker
apt:
name: docker-ce
state: latest
update_cache: yes
- name: Append Docker group to the admin user
user:
name: "{{ admin_id }}"
append: yes
groups: docker
내용만 보아도 어떤 작업을 진행하는지 예상이 됩니다. 이런 점도 Ansible의 많은 매력 중 하나인 것 같아요!
이제 해당 playbook을 가지고 작업을 진행하기 위해서 Inventory 파일을 생성해줍시다!
[host]
127.0.0.1
인벤토리에 대해 궁금하다면 이곳을 클릭해 참고해주세요.
모든 준비가 끝났다면 드디어..! 시작할 수 있게됩니다.
(사실 위의 설정들도 Vagrantfile에 정의해두면 더욱 편리하답니다)
ansible-playbook -i ./hosts ./playbook.yml
output:
PLAY ***************************************************************************
TASK [setup] *******************************************************************
ok: [127.0.0.1]
TASK [Update repositories cahce and install] ***********************************
ok: [127.0.0.1]
TASK [Add Docker GPG apt Key] **************************************************
changed: [127.0.0.1]
TASK [Add Docker Repository] ***************************************************
changed: [127.0.0.1]
TASK [Install Docker] **********************************************************
changed: [127.0.0.1]
TASK [Append Docker group to the admin user] ***********************************
changed: [127.0.0.1]
PLAY RECAP *********************************************************************
127.0.0.1 : ok=6 changed=4 unreachable=0 failed=0
설치가 끝나고..
로컬에 설치된 docker engine의 버전을 확인하며 성공적으로 작업을 진행했음을 확인했어요.
docker verion
output:
Client: Docker Engine - Community
Version: 19.03.11
API version: 1.40
Go version: go1.13.10
Git commit: 42e35e61f3
Built: Mon Jun 1 09:12:22 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.11
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 42e35e61f3
Built: Mon Jun 1 09:10:54 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
마치며
이렇게 사용하기도 편리한 도구들을 가지고 많은 양의 서버를 운영한다면 어떨까요?
확실한건 이전과는 다른 자동화 세계의 관리를 시작하는거라고 할 수 있겠죠.
저는 흥미에 기반으로 공부를 시작했지만 제가 생각하는 우아한 도구들 중 손에 꼽는다고 생각돼요! 사용하는 내내 크게 경탄한 기억밖에 없답니다.
많은 자료들을 공부해 여러분들이 쉽게 이해할 수 있도록 정리하며 노력할게요. 감사합니다.