본문 바로가기
INFRA/Operation

앤서블 아키텍처 구성 및 프로세스

by BTC_지수 2022. 7. 21.

안녕하세요! 하씨가문의 영광입니다!!

이번에는 "앤서블 아키텍처 구성 및 프로세스" 에 관해서 알아보도록 하겠습니다.

이전에 알아봤던 앤서블의 개념! 에 이어서 앤서블 구성들은 어떻게 되어있는지 하나씩 파헤쳐보도록 하겠습니다.

그럼 시작해보도록 하겠습니다!

 

Ansible Architecture

 

"하나의 제어 노드(Server)에서 여러 관리 노드(Client)를 관리하는 구조"

 

아시다시피 Managed Node와의 통신은 SSH (Secure Shell)을 통해서 이루어집니다.

 

구성에 관해 remind 할겸! 조금 더 파헤쳐 보도록 하겠습니다!

 

1. 제어 노드 (Control Node)

  : Ansible이 설치된 모든 머신을 뜻합니다.

  : Python이 설치된 모든 컴퓨터를 제어 머신으로 사용 가능하며, 여러 개의 제어노드를 가질 수 있습니다.

  : 명령어나 Playbook 실행 가능합니다. 

  : /usr/bin/ansible 또는 /usr/bin/ansible-playbook 를 호출하여 실행합니다.

 

2. 관리 노드 (Managed Node)

   : "Ansible로 관리하는 장치들" 입니다.

 

흘러가는 "프로세스 Flow" 는 위의 그림과 같습니다.

 

앞단원에서, 세부항목으로

Inventory, Playbook, Module, API, Plugin 으로 구성되어있다는 점을 저희가 알아보았습니다. 그럼 이번에는 세세하게 한번 파헤쳐보도록 하겠습니다.

 

인벤토리 (Inventory)

인벤토리는 관리 노드의 목록을 기술하는 파일입니다.

 

항목 설명
파일  기본 파일 : /etc/ansible/hosts

기본 파일 변경 : ansible-playbook 커맨드의 I 옵션으로 지정
$ ansible-playbook | inventory_file playbook.yml
두 개 이상의 인벤토리 파일 사용 : -i 옵션으로 붙입니다.
ansible-playbook get_logs.yml -i staging -i production 
작성 형식 인벤토리 플러그인에 따라 여러가지 형식으로 작성될 수 있습니다.
기본적으로 INI 또는 YAML 형식으로 쓰입니다.

INI 형식 :
[webservers]
foo.example.com
bar.example.com

YAML 형식 :
all:
  hosts:
     mail.example.com:
  children:
     webservers:
        hosts:
           foo.example.com:
           bar.example.com:
Grouping 그룹을 만들어 관리노드를 묶어줄 수 있습니다.
하나의 host를 여러 그룹에 포함시킬 수 있으며, 그룹단위로 명령을 내릴 수도 있습니다.
기본적으로 모든 host는 'all' 이라는 그룹에 모두 포함되며,
all을 제외하고 아무 그룹에도 속하지 않는 host는 'ungrouped' 그룹에 속한다.

[cisco]
rtr1 ansible_host=18.12.12.12 private_ip=172.1.1.1
[arista]
rtr2 ansible_host=18.12.12.13 private_ip=172.1.1.1
nested [routers:children]
cisco
arista
인벤토리 변수 Group 변수는 Group 내 모든 Device에 적용된다.

[cisco:vars]
ansible_user=ec2-user
ansible_network_os=ios
IP 명시 방법
  • ansible_host로 IP를 써주는 방법
    rtr1 ansible_host=12.12.12.12

  • IP를 직접적으로 사용하는 방법
    12.12.12.12 ansible_user=vmadmin ansible_password='123’

  • /etc/hosts 파일에 다음과 같이 DNS를 등록하면
    12.12.12.12abc.com

    아래와 같이 별칭으로 사용 가능함.
    abc.comansible_user=vmadmin ansible_password='123'

 

플레이북 (Playbook)

플레이북은 "반복해서 실행하고자 해당 작업을 실행 순서대로 저장해 놓은 정렬된 작업 리스트" 입니다.

- 순서가 있는 작업 목록을 반복적으로 실행 가능합니다.

- Ansible의 환경 설정, 배포가 가능케 합니다.

- 변수와 작업이 포함될 수 있습니다.

항목 설명
구성 하나 이상의 Play 들로 이루어져 있습니다.

- Plays : 서버(그룹)에 대해 정의된 role 들을 실행 시키는 것. 여러 개의 tasks로 이루어져 있습니다.
- tasks : ansible의 작업 단위 (ad-hoc 명령을 사용하여 단일 작업을 한 번 실행할 수 있습니다.)
- Modules


정의파일 YAML 형식으로 작성됩니다.
기능 - 반복 (with_item, with nested, until …)
- 조건 분기 (when, register, …)
- 다른 playbook 참조 (include, role, …)
- 외부 정보 참조
- 환경 변수, 파일 등 (environment, lookup, vars_prompt,…)
- 커스텀 모듈을 이용한 확장

플레이북

 

YAML

"사람이 쉽게 읽을 수 있는 데이터 직렬화 양식" 입니다.

마크업 보다 구조화 된 데이터 표현을 위한 텍스트 형식의 포맷

 

YAML 이라는 이름은 'YAML ain't Markup Language' (YAML은 마크업 언어가 아니다.) 라는 재귀적인 이름에서 유래되었으나. 'Yet Another Markup Language' (또 다른 마크업 언어) 이 현재 공식적인 약자 입니다.

 

확장자는 '.yml' 을 씁니다.

Json YAML
‘[
  “apple”,
  {
     “size”:[“a”,”b”,1]
  }
]’
- apple
- size:
  - a
  - b
  - 1

 

모듈 (Module)

Ansible 이 실행하는 코드 단위입니다.

- 자동화 기능 내장 패키지로 하나의 완전한 단위 기능 제공

- 또한 Ansible은 내장함수가 매우 풍부한 것이 장점 (20년 7월 기준 약 1652개)

항목 설명
실행 방법 Ansible 명령을 사용해서 단일 모듈을 호출 가능
Ansible-playbooks 명령을 통해서 여러 모듈 호출 가능
개발 언어 모든 언어를 사용하여 개발 가능
I/O 입력 : Attributes 로 입력을 전달 받음
출력 : JSON Format로 표준출력(STDOUT)으로 사용
-> 단순히 I/O에 국한하지 않고 외부 시스템과의 연동과 같이 Side-Effect 발생시키는 것도 가능.
구현 과정 개발환경 구축
1) Ansible Module 이 저장될 library 디렉토리 생성
2) Ansible 프로젝트를 Git 저장소로부터 복제한다. 쉘 환경변수를 import 한다.

모듈 명세 작성
1) 모듈의 속성을 정의하고 속성의 데이터 타입, 필수 여부, 허용 가능한 값, 기본 값 등을 정의합니다.
2) 모듈이 반환할 수 있는 모든 상태 코드를 정의 합니다. 정상 코드 이외의 모든 에러 코드를 반환하는 경우에는 모듈이 수행하기 전과 후의 환경이 동일해야 합니다. (멱등성)
3) 모듈에 입력 받은 속성에 따라 비즈니스 로직을 구현하고, 처리 결과를 JSON Format 생성합니다.
4) 모듈의 모든 처리가 완료되면, exit_json (정상) 혹은 fail_json (실패) 중에 하나를 반환해야 합니다.

테스트 수행
1) test-module cli 툴을 사용하여 모듈을 테스트할 수 있습니다.

 

***참고 : 공식 내장 모듈***

쉘 스크립트로 작성하면 복잡한 절차가 필요하지만, Ansible에 내장된 모듈은 사용자가 의식하지 않고도 안전하고 적절한 처리를 실행할 수 있도록 합니다.

 

기능 설명
파일 처리 file : 파일 작업
copy, template : 파일 배포
fetch : 파일 수집
lineinfile : 기존 파일을 행 단위로 수정
서비스 제어 service : 서비스 시작/정지 등
패키지 관리 yum, apt : 지정/의존 패키지 설치
명령어 실행 모듈 command, sell : 외부 커맨드 실행과 출력 결과 보고 등

 

< 참고 : https://11001.tistory.com/97 >

 

오늘은 Ansible 의 프로세스에 대해서 더 자세하게 파헤쳐보았습니다!

오늘도 많은 분들께 도움이 되기를 바라면서 다음에는 더 유용한 내용을 찾아뵙겠습니다.

댓글