클라우드 아카이브

[IaC] Ansible Galaxy의 개념과 구성요소 본문

Cloud Native Solution/[IaC] ansible

[IaC] Ansible Galaxy의 개념과 구성요소

Cloud Engineer 2021. 10. 22. 15:43

1. 들어가기 전

시스템 구성관리를 앤서블로 자동화하면서 playbook을 지속적으로 작성하다보면 동일한 구성을 수행함에도 불구하고 환경의 차이 등과 같은 요소에 의해 새로운 Playbook을 작성해야되는 문제가 발생합니다. 즉, 재사용성(Reusability) 부분에서 이슈가 발생하는데요. 이러한 이슈를 해소하기 위해 앤서블의 Role 기능이 생기면서 재사용성 이슈를 해결하게 되었습니다. 또한, 앤서블에서 필연적으로 사용되는 변수, 정적/동적 파일, 핸들러 등을 체계적으로 구성하도록 도와주는 디렉토리 구조를 제공하는데요. 본 포스팅에서는 앤서블에서 Role 기반으로 구성관리를 프레임워크 형태로 구조화한 Ansible Galaxy의 개념과 구성요소에 대해 알아보는 글을 작성하겠습니다.

2. 앤서블 겔럭시란?

앤서블 겔럭시 CI

도구 사용자 관점에서 앤서블 겔럭시를 정의하면, Playbook을 구성하는 다수의 모듈을 기능 단위로 나누어 공통 부분을 재사용하기 위해 디렉토리 별로 구조화한 오픈소스입니다. 디렉토리로 구조화한 것을 넘어 앤서블 사용자들이 다양한 기능을 오픈소스로 배포하여 다른 사용자들이 가져다 사용할 수 있도록 하는 SVN 역할을 수행합니다.

앤서블 커뮤니티 공간

위 페이지를 보고 싶으면 여기를 클릭하세요.

빨간 박스가 되어있는 System을 클릭하면 아래와 같이 다른 앤서블 사용자들이 Role을 구성하여 배포한 다양한 오픈소스를 확인할 수 있습니다. 우주에서 겔럭시는 하나의 은하인 동시에 넓은 우주에서 수많은 별들이 모인 생태계가 되기도 합니다. 앤서블 겔럭시 또한 누군가가 작성한 자동화 코드를 오픈소스로 배포할 수 있도록 오픈소스 생태계를 구성하기 위한 목적으로 탄생하게 된 것입니다. 공통적으로 사용되는 수많은 기능이 존재할 것이고 이러한 기능을 누군가가 코드로 작성해놓으면 다른 사람들이 해당 코드를 가져다 사용하면 코드 작성에 따른 시간을 절약할 수 있으니까요.

앤서블 오픈소스 커뮤니티

위 페이지를 보고 싶으면 여기를 클릭하세요.

3. 앤서블 겔럭시 구성요소

3.1 - 디렉터리 구조

$ tree example 
example
├── README.md
├── defaults		# 우선순위가 낮은 기본 변수를 설정
│   └── main.yml
├── files		# 각 대상 서버에 배포할 파일
├── handlers		# role 또는 role 외부에서 사용될 수 있는 핸들러
│   └── main.yml
├── meta		# 메타 데이터를 정의 (예 : Role에 대한 정보 및 호환 버전 등을 정의)
│   └── main.yml
├── tasks		# 공통 기능을 정의 (Playbook에 작성했던 모듈)
│   └── main.yml
├── templates		# role 구성 시 변경 사항 수정을 지원하는 파일 템플릿
├── tests
│   ├── inventory
│   └── test.yml
└── vars		# 우선순위가 높은 변수를 설정
    └── main.yml

8 directories, 8 files

3.2 - files : 서버에 전송할 정적 파일 저장

구성관리 대상 서버에 저장하고 싶은 정적 파일이 있을 경우 해당 디렉토리에 위치시킵니다. 예를 들어 Windows 업데이트가 필요할 때 msu 파일을 해당 경로에 위치시키면 됩니다.

3.3 - handlers : tasks에서 특정 이벤트 발생 시 해당 모듈을 작동

주요 플레이북에 구성된 특정 모듈에 변경사항이 반영될 때 어떤 모듈을 작동시키고 싶을 경우 모듈을 handler의 main.yml에 작성해줍니다. 아래 예시와 같이 구성 대상 서버에서 ntp를 사용하고 있을 경우 재시작을 시켜주는 기능을 handlers의 main.yml에서 작성해줍니다.

# 1. tasks/main.yml
- name: copy a ntp.conf
  vars:
    ntp_1: server kr.pool.ntp.org iburst
    ntp_2: server time.bora.net prefer iburst
    ntp_3: server time.nuri.net iburst
  template:
    src: /home/ubuntu/consist-of-kubernetes-system/ansible/roles/03.ntp_configuration/templates/ntp.j2
    dest: /etc/ntp.conf
    owner: root
    group: root
    mode: 0644
    backup: yes
  when: use_ntp | default(false) == true
  # 특정 상황에서 handlers 작동시키기 (notify 키워드)
  notify:
  - 'restart ntp'
  
# 2. handlers/main.yml
---
# notify에 의해 아래 모듈 작동
- name: restart ntp
  service:
    name: "{{ item }}"
    state: restarted
  with_items:
    - ntp

3.4 - task : 공통 기능을 정의

공통 기능을 해당 디렉토리에서 작성해줍니다.

3.5 - templates : 서버에 전송할 동적 파일 저장

특정 조건에 따라 동적으로 내용이 변경되는 파일을 해당 위치에서 작성해줍니다. 앤서블은 상황에 따라 변경되는 파일을 Jinja2라는 템플릿 엔진으로 반영할 수 있도록 도와줍니다.

3.5.1 - 템플릿 작성 예시

Jinja 템플릿 엔진으로 초기 NTP 설정과 관련된 파일 템플릿을 작성할 경우 예시입니다. NTP 설정 파일에서 상황에 따라 변경되는 부분을 변수로 지정하여 관리하도록 합니다.

3.5.1.1 - task 파일 : NTP 설정 파일에서 동적으로 변경되는 부분을 변수로 지정하여 관리

# 파일 명 : /etc/ansible/roles/03.ntp_configuration/tasks/main.yml
---
- name: copy a ntp.conf
  # Jinja 템플릿에서 사용할 변수 정의
  vars:
    ntp_1: server kr.pool.ntp.org iburst
    ntp_2: server time.bora.net prefer iburst
    ntp_3: server time.nuri.net iburst
  # Jinja 템플릿 위치 및 정보 등을 정의
  template:
    src: /etc/ansible/roles/03.ntp_configuration/templates/ntp.j2
    dest: /etc/ntp.conf
    owner: root
    group: root
    mode: 0644
    backup: yes

3.5.1.2 - templates 파일 : Jinja 템플릿 엔진 기반으로 작성한 파일

# 파일 명 : /etc/ansible/roles/03.ntp_configuration/templates/ntp.j2

# Config by Ansible
# 2021 01.22

driftfile /var/lib/ntp/drift


statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable


restrict default nomodify notrap nopeer noquery
restrict -6 default nomodify notrap nopeer noquery

restrict 127.0.0.1
restrict ::1

# 변수로 동적으로 변경되는 부분을 정의
{{ ntp_1 }}
{{ ntp_2 }}
{{ ntp_3 }}

#includefile /etc/ntp/crypto/pw
#keys /etc/ntp/keys
#disable monitor

3.6 - vars : 우선순위가 높은 변수를 지정

우선순위가 높지만 구성 관리에 필요한 내용을 변수로 지정해줍니다. 예를 들어 hostname 등을 변수로 지정해주며 모듈에서 지속적으로 재사용할 수 있도록 해줍니다.

3.7 - defaults : 우선순위가 낮은 변수를 지정

우선순위가 낮지만 구성 관리에 필요한 내용을 변수로 지정해줍니다. vars보다 우선순위가 낮기 때문에 동일한 변수에 대해 값을 다르게 지정하더라도 vars의 값을 변수값으로 가져가게 됩니다. 예를 들어 vars에서 hostname이라는 변수를 a라고 지정하고 defaults에서 hostname이라는 변수를 b라고 지정했을 때, 앤서블 엔진은 hostname 변수 값을 a라고 인식하여 시스템에 반영해줍니다.

4. 마무리

이상으로 앤서블 겔럭시의 개념과 구성 요소에 대해 알아보는 시간을 가졌습니다. 다음 포스팅에서는 본 내용을 바탕으로 앤서블 겔럭시를 사용하여 Role 기반으로 구성관리 실습과 관련된 포스팅을 작성하겠습니다.

 

[출처]

- https://medium.com/@jyson88/ansible-role-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95-1793da8a452e

- https://galaxy.ansible.com/

- https://wickso.me/ansible/basic/

 

 

Comments