새소식

IaC/Ansible

[A101 Study 1주차] Ansible 사용 기초 - Inventory, Playbook, Variables, Vault, Facts

  • -

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 가 정의된 텍스트 파일

 

인벤토리 파일에는 자동화 대상 호스트의 IPDomain 모두 사용 가능합니다.

 

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가지 변수를 사용할 수 있으며, 특정 경우 작업 변수를 추가로 사용할 수 있습니다.

 

앤서블 변수

 

  1. 그룹 변수
  2. 호스트 변수
  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 정보를 출력한 모습

 

 


 

이번 주차에서는 앤서블에서 활용되는 기본 개념에 대해 알아 보았습니다.

 

참고 문서

 

Contents

포스팅 주소를 복사했습니다