CloudNet@ 팀의 가시다님께서 Leading 하시는 A101 Study 1주차 스터디 내용 정리
해당 스터디는 '앤서블로 시작하는 인프라 자동화' 책을 기반으로 진행하였습니다.
0. 실습 아키텍처
실습 환경은 아래와 같이 구성했습니다.
Ansible 을 사용하기 위한 Ansible, Python 은 이미 설치된 상태입니다.
Control Node 1 대 + Target Node 3대
Node |
OS |
vcCPU |
Memory |
Disk |
IP |
server |
Ubuntu 22.04 |
2 |
4GB |
30GB |
10.10.1.10 |
tnode1 |
Ubuntu 22.04 |
2 |
4GB |
30GB |
10.10.1.11 |
tnode2 |
Ubuntu 22.04 |
2 |
4GB |
30GB |
10.10.1.12 |
tnode3 |
Ubuntu 22.04 |
2 |
4GB |
30GB |
10.10.1.13 |
1. Inventory
인벤토리는 앤서블을 통해 자동화할 Target Node 가 정의된 텍스트 파일
인벤토리 파일에는 자동화 대상 호스트의 IP 와 Domain 모두 사용 가능합니다.
1.1. 그룹별 호스트 작성
호스트별로 역할(Role) 을 부여하고 역할별로 특정 작업을 수행해야할 경우, 그룹별 호스트를 설정할 수 있습니다.
인벤토리 파일은 별도의 확장자가 존재하지 않으며, INI 형식 또는 YAML 형식을 사용하여 작성합니다.
다음은 web , db 그룹으로 구분하여 인벤토리 파일을 작성한 예시입니다.
1.2. Ansible 환경 설정 (ansible.cfg)
ansible.cfg 파일을 사용하면 앤서블 실행에 대한 환경 설정을 할 수 있습니다.
매개변수 |
설명 |
inventory |
인벤토리 파일 경로 지정 |
remote_user |
대상 호스트 연결 시 사용하는 사용자 이름 |
ask_pass |
대상 호스트 연결 시 SSH 암호를 묻는 메시지 표시 여부 |
[defaults]
inventory = ./inventory
remote_user = root
ask_pass = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
1.3. Ping 모듈 사용
Ping 모듈을 사용하여 인벤토리에 정의된 호스트로 연결 테스트를 할 수 있습니다.
ansible -m ping web
2. Playbook
플레이북은 앤서블을 통해 수행할 작업 정의 파일
2.1. Playbook 작성 및 실행
플레이북은 YAML 형식을 사용하여 작성합니다.
다음은 Debug 모듈을 사용한 간단한 Playbook 입니다.
# first-playbook.yml
---
- hosts: all
tasks:
- name: Print message
debug:
msg: Hello CloudNet@ Ansible Study
플레이북 실행
ansible-playbook first-playbook.yml
3. 변수
변수를 사용해 플레이북 실행 시 원하는 값을 동적으로 변경하여 사용
앤서블은 플레이북의 재사용성을 높이기 위해 변수 기능을 제공하고 있습니다.
앤서블에서는 총 4가지 변수를 사용할 수 있으며, 특정 경우 작업 변수를 추가로 사용할 수 있습니다.
앤서블 변수
- 그룹 변수
- 호스트 변수
- 플레이 변수
- 추가 변수
( + 작업 변수 )
변수 우선 순위
추가변수(실행 시 파라미터) > 플레이 변수 > 호스트 변수 > 그룹 변수
3.1. 그룹 변수
인벤토리에 정의된 '호스트 그룹'에 적용하는 변수
- 인벤토리에 선언하며 그룹명과 함께 ':vars' 라는 문자열을 추가해 변수를 선언합니다.
- 그 후, 플레이북에서 겹중괄호 '{{ }}' 를 통해 변수를 사용할 수 있습니다.
3.2. 호스트 변수
인벤토리에 정의된 '특정 호스트'에 적용하는 변수
- 인벤토리에 선언하며 특정 호스트 옆에 변수를 선언합니다.
tnode1 호스트에 대해서만 호스트 변수인 'user=ansible1' 변수가 적용되며,
나머지 호스트는 그룹 변수인 'user=ansible' 변수가 적용됩니다.
3.3. 플레이 변수
플레이북에 선언하여 사용하는 변수
- 플레이북에 직접 선언하여 사용하며, 변수를 별도의 파일로 분리하여 관리할 수 있습니다.
3.4. 추가 변수
플레이북 실행 시 파라미터로 넘겨주는 변수
- 앤서블 CLI 를 사용할 때 넘겨주는 변수입니다.
ansible-playbook -e user=ansible4 create-user3.yml
3.5. 작업 변수
플레이북 실행 결과를 변수로 저장
- 플레이북의 특정 작업(task) 를 수행하고 그 결과를 후속 작업에서 사용할 때 사용되는 변수입니다.
- 작업 변수는 'register: 변수명' 으로 사용합니다.
4. Vault
패스워드나 API 키 등의 앤서블 활용에 필요한 데이터를 암호화할 수 있는 기능
- 앤서블에 사용되는 인벤토리, 플레이북 등의 파일을 암호화 & 복호화해서 사용할 수 있습니다.
- 암호화 및 복호화 시 사용되는 패스워드는 잊어버리지 않게 별도의 관리가 필요합니다.
4.1. Playbook 암호화
# 암호화
ansible-vault encrypt create-user.yml
New Vault password:
Confirm New Vault password:
4.2. 암호화된 Playbook 실행
암호화된 플레이북을 그냥 실행하려고 하면 오류가 발생
root@server:~/my-ansible# ansible-playbook create-user.yml
ERROR! Attempting to decrypt but no vault secrets found
암호화된 파일이 포함된 플레이북을 실행할 때는 'vault-id @prompt' 옵션 사용
ansible-playbook --vault-id @prompt create-user.yml
5. Facts
앤서블이 관리 대상 호스트에서 자동으로 수집한 정보
- 팩트는 앤서블 실행시 기본적으로 활성화되어 있습니다.
- 앤서블 실행 시 출력되는 'TASK [Gathering Facts] 작업'이 그것입니다.
팩트에는 다음과 같은 정보가 포함
- 호스트 이름
- 커널 버전
- 네트워크 인터페이스 이름
- 운영체제 버전
- CPU 개수
- 사용 가능한 메모리
- 스토리지 장치의 크기 및 여유 공간
팩트를 사용하여 대상 호스트의 커널 버전과 OS 정보를 출력한 모습
이번 주차에서는 앤서블에서 활용되는 기본 개념에 대해 알아 보았습니다.
참고 문서