Terraform Up & Running Ch 1
IaC : Infrastructure as Code
5가지 IaC의 큰 줄기
1. Ad hoc scripts
2. Configuration management tools
3. Server templating tools
4. Orchestration tools
5. Provisioning tools
1. Ad hoc Scripts
Ad hoc : "이것을 위해" 또는 "특별한 목적을 위해서" 라는 뜻의 라틴어 ( Reference : Wikipedia )
즉, 해당 작업만을 위해 생성된 스크립트를 뜻한다.
예로 들어, 물리 서버에 아파치를 설치하고 서비스 실행하는 코드를 bash 스크립트로 작성을 하면 해당 스크립트는 webserver.sh로 웹서버 설치 및 실행을 위한 ad-hoc 스크립트가 된다.
# webserver.sh
sudo apt-get update
sudo apt-get install -y php apache2
sudo service apache2 start
장점 : 자신에게 편한 언어로, 자신에게 편한 스타일로 작성 가능하다. ( 단점이기도 하다 ; 2. Configuration man. 참고)
단점 : 당연하게, 모든 task마다 새로운 스크립트를 작성해야 한다.
2. Configuration Managment Tools
용어 자체에서 알 수 있듯이, 사용하고자 하는 소프트웨어/패키지 등을 설치 및 관리하기 위해 만들어진 툴들이다.
위의 webserver.sh의 예를 Ansible 로 작성한다면,
# web-server.yml
- name : Update apt-get cache
apt :
update_cache : yes
- name : Install PHP
apt :
name : php
- name : Install Apache
apt :
name : apache2
- name : Start Apache
service : name=apache2 state=started enabled=yes
와 같이 작성할 수 있다.
bash script와 매우 유사하지만, 차이점을 서술하자면 아래와 같다 :
Coding Conventions
Ansible와 같은 툴들은 consistent, predictavle struccture 와 같이 특정 구조/스타일을 강요한다. 이는 결국 지속적이고 읽기 쉽고 모든 사람에게 동일하게 적용이 되므로 공유하기 용이하다.
Idempotence
위의 bash 스크립트는 단 한 번의 실행을 위해서 작성된 스크립트이다. 만약, 이 스크립트를 여러 번 실행하면 어떻게 될까? 당연히 오류가 나올 수 있고 심하면 system failure까지 나올 수 있다. 하지만, Ansible와 같은 툴을 사용하면 몇 번을 재실행해도 상관이 없다. 알고 있겠지만, Idempotence는 여러번 동일한 작업을 반복해도 동일한 결과를 보장하는 지에 대한 용어이다.
Distribution
Ansible을 사용하면, multiple server을 한 번에 관리(배포) 할 수 있다.
# hosts
[webservers]
11.11.11.11
11.11.11.12
11.11.11.13
...
# playbook.yml
- hosts : webservers
roles :
- webserver
위의 코드/텍스트를 작성한 뒤에
ansible-playbook playbook.yml
를 적용시키면 커맨드 하나로, 여러 서버에 한 번에 배포할 수 있다.
ex. Chef, Puppet, Ansible, SaltStack
3. Sever Templating Tools
핵심 아이디어는, 필요한 정보들을(OS, software, files, relevant details, ...) 모두 포함하는 self-contained snapshot를 capture한 서버의 image를 생성하여 사용하는 것이다.
(Packer로 template를 작성하고 난 뒤에 Ansible과 같은 툴로 여러 대의 서버에 배포하는 형식으로 사용을 하기도 한다 )
Image를 생성하는 방식에는 크게 2가지가 존재한다.
1. Virtual Machine (VM)
여러 많은 곳에서 찾아볼 수 있겠지만, 주어진 환경에서 "hypervisor"라는 소프트웨어를(ex. VMWare, VirtualBox, ... ) 사용하여 하드웨어를 포함한 모든 시스템을 emulate하는 방식이다.
장점 : host machine 및 다른 VM image들과 완전하게 독립되어(isolated) 있다 ; 보안도 보장이 된다.
단점 : 완전하게 독립적인 OS를 구성하는 것이기 때문에, CPU usage, startup time와 같은 overhead가 매우 크다.
2. Container
ex. Docker, Packer, Vagrant