728x90
반응형
Ansible이란?
- 기존에는 쉘 스크립트에 패키지 설치, 수정된 설정파일 등을 나열하고 스크립트를 실행하여 동일한 환경의 리눅스를 수정했다.
- 하지만 데이터 센터 중심의 인프라 환경에서 클라우드 환경으로 변화하고, 관리해야 할 서버의 숫자가 급격하게 증가하며 동시에 많은 서버에 동일한 환경을 배포해야하는 경우가 많이 있고 이는 쉘 스크립트로 불가능했다.
- 이를 해결하기 위해 IaC(Infrastructure as a Code)가 등장했고, IaC은 컴퓨터의 인프라 구성을 소프트웨어를 개발하는 것처럼 코드로 작성하는 것을 의미한다.
- Ansible도 이러한 IaC 개념이 도입되어 자동화 도구를 이용하여 인프라의 설정을 코드로 작성하고 이를 모든 서버에 배포함으로써 특정 환경을 동일하게 유지할 수 있도록 도와준다.
Ansible 기본 개념
- Ansible은 환경설정, 배포를 가능하게 하는 언어이고, remote 서버에 접속해서 무언가를 실행시키는 정책을 기술한다.
- yaml 문법으로 정책이 기술되어 있으며 좀 더 고급 단계에서는 로드밸런서를 모니터링하는 복잡한 환경에서 사용할 수 있도록 한다.
- 각 playbook은 하나 이상의 ‘play’를 두게 된다. Play의 목적은 여러 호스트들에 잘 정의된 ‘role’과 ‘task’를 매핑하는 역할을 한다.
- Role을 좀 더 편하게 관리하기 위해서 미리 정의된 yaml 파일을 include을 하는 것이 가능하다.
- 또한 host inventory 파일에 정의한 서버 그룹별로 각각 나누어 provision 할 수 있도록 할 수 있다.
- 서버당 디렉터리를 나누어서 각각의 설정 정보가 정의된 파일을 읽어 설치하게 한다.
Ansible 장점
1. Idempotency(멱등성) 지원
- 멱등성: 여러번 실행해도 같은 결과 값이 나오는 성질
- Ansible에서의 멱등성: 같은 모듈을 반복해서 실행해도 결과가 동일하게 출력됨으로써 멱등성을 일관되게 수행할 수 있다.
- 바뀌는 부분이 있으면 그 부분만 반영된다.
- 단 shell, command, file module은 보장되지 않는다.
2. Modular
- 많은 모듈 지원
- Shell에 의존하지 않고 Ansible에서 지원하는 Module로 구성관리에 용이함
3. YAML 형식 지원
- 기존의 Shell Scripts보다 간편하게 구성 가능
4. 대형 워크로드에 용이
- 많은 서버에 구성이 필요한 경우 Shell Scripts보다 신속하게 처리 가능
Ansible의 한계
- 시스템의 초기 설치 수행은 불가능 (kickstart, pxe 등을 사용하여야 함)
- 시스템 모니터링은 지원하지 않음
- 시스템 변경사항은 추적하지 않음
Ansible 구조
1. control 노드(컨트롤 머신)
- Ansible을 설치하고 실행하는 노드
- 원격으로 managed 노드 제어
- 프로젝트 파일의 사본 보관
- Python v2.6 이상 필요
2. managed 노드
- Ansible을 이용해 관리하고자 하는 서버
- managed 노드에는 Ansible이 설치되지 않음
- Inventory에 나열된 대상
- 단독 또는 그룹으로 관리 가능
- Python v2.4 이상 및 ssh 필요
3. 인벤토리(Inventory)
- remote 서버에 대한 meta 데이터를 기술하는 파일. managed 노드에 대한 IP 주소, 호스트 정보, 변수와 같은 정보를 지정.
- 기본 파일인 /etc/ansible/hosts를 읽게 하거나, 따로 inventory 파일을 만들고 옵션을 주어 동작하게 할수 있다. 만약 고정 ip를 가지고 있고 hosts 파일 안에 들어가 있지 않는 서버가 있다면 설정 파일을 만들수 있고 테스트 환경을 만들때 유용하다.
Inventory 예시
[test_servers]
192.168.0.1
192.168.0.2
192.168.0.3
4. 플레이북(Playbook)
- 여러 모듈 호출에 대해 정의하는 파일 및 명령
- Playbook 파일에 Task를 정의하고, playbook 명령을 이용함.
- 모듈을 호출하는 task 이외에 관리할 서버 지정, 변수 정의 등 모든 Ansible 작업에 대해 정의할 수 있다.
- 기본적으로 YAML 형식으로 작성
Playbook 예시
- name: Playbook의 이름
- hosts: Remote host 이름
- become: 대상 호스트에 root 사용자로 작업을 수행하도록 지정
- tasks: Remote host에서 수행할 작업들
---
# 첫번째 플레이
- name: intranet
hosts: web.example.com
become: yes
tasks:
- name: check httpd,firewalld / and install
yum:
name:
- httpd
- firewalld
state: present
- name: html page data
copy:
content: "welcome to the example.com intranet!\n"
dest: /var/www/html/index.html
- name: service firewalld
service:
name: firewalld
enabled: true
state: started
- name: firewalld startup, and authorize http port
firewalld:
service: http
state: enabled
permanent: true
immediate: yes
- name: service httpd
service:
name: httpd
enabled: true
state: started
# 두번째 플레이
- name: test server
hosts: localhost
become: no
tasks:
- name: check url
uri:
status_code: 200
url: http://web.example.com
return_content: yes # -> 서버 응답이 task 결과에 출력된다.
Playbook 실행
- -i : Remote host의 정보를 가지고 있는 inventory 파일 경로를 지정
- --extra-vars : Playbook에 전달할 인자 값
- HOST_NAME: Remote host 이름
- USER_NAME: 생성할 사용자 계정 이름
- PASSWORD: 생성할 사용자 계정 패스워드
$ ansible-playbook -i [path/to/inventory] inventory.yaml \
--extra-vars "HOST_NAME=[HOST_NAME] USER_NAME=[USER_NAME] PASSWORD=[PASSWORD]"
###### example ######
$ ansible-playbook -i /dev/ansible/hosts inventory.yaml \
--extra-vars "HOST_NAME=all USER_NAME=test PASSWORD=aaa123"
5. Ad-hoc
- 단일 모듈 호출을 하여 실행하는 명령을 의미. 즉, 하나의 task를 호출하는 명령어
- ansible의 playbook을 작성하여 수행하는 것이 아니라 임시적으로나 또는 특별하게 어떤 작업을 수행하기 위해서 사용할 수 있는 실행방법이라고 할 수 있다.
6. 모듈(Module)
- Anible이 실행하는 코드 단위
- 데이터베이스 처리, 사용자 관리 등 다양한 용도로 사용
- 단일 모듈 호출 또는 플레이북에서 여러 모듈 호출도 가능
7. 태스크(Task)
- Ansible의 작업 단위
- ad-hoc 명령을 사용하여 단일 작업을 한번에 실행
728x90
반응형