본문 바로가기
Infra

Ansible로 서로 다른 OS의 서버를 관리해보자 (2)

by MC매드 2023. 12. 5.

안녕하세요, 메가존클라우드 Mass Migration Center의 AAT에서 프론트엔드와 백엔드 개발을 담담하고 있는 MC매드(A.K.A. The master of ansible)입니다.

 

이번 포스팅에서는 전 포스팅에 이어 Ansible로 windows, linux, unix 서버를 컨트롤할 수 있도록 실습 가이드를 작성해보겠습니다.

 

[지난 포스팅: Ansible로 서로 다른 OS의 서버를 관리해보자 (1)]

 


07. 폴더 구조화

├── ansible.cfg
├── hosts
├── main.yaml
├── roles
│   ├── apache
│   │   ├── files
│   │   │   └── info.sh
│   │   ├── tasks
│   │   │   └── main.yaml
│   │   └── vars
│   │       └── main.yaml
│   └── nfs
├── script
│   └── info.sh
└── vars
    └── vars.yaml

 

실습을 진행하기에 앞서, Ansible이 설치된 /etc/ansible 경로에 다음과 같이 폴더와 빈 파일을 만들어주시기 바랍니다.

각각의 파일에 내용을 작성해가며 수행 기능과 옵션을 알아보고, 마지막에는 명령어 실행을 통해 ansible을 동작시켜 보겠습니다.

 

08. ansible.cfg

ansible.cfg 파일은 ansible 설정 파일로써, inventory가 작성된 파일 경로를 명시하거나 ansible 동작에 관한 여러 옵션을 설정하실 수 있습니다. 기본적으로 설정하는 옵션들에 대해서 알아보겠습니다.

[defaults]
# inventory = ./inventory.yaml
host_key_checking = False
remote_user = ubuntu
become = True
# become_user = ubuntu                  ## 대상 타켓 User

 

inventory 옵션은 inventory가 작성된 파일 경로를 명시할 수 있습니다. 현재 저희가 진행하는 실습에서는 기본 인벤토리 파일인 hosts 파일을 사용하고 있으므로 예시상 작성했을 뿐, 주석 처리를 했습니다.

host_key_checking 옵션은 호스트 키를 확인할 것인지에 대한 옵션으로, 본 실습에서는 False로 설정하고 진행하겠습니다.

remote_user 옵션은 대상 호스트에 로그인하는 유저를 정해주는 것으로, 위 코드에서는 대상 호스트에 ubuntu 유저로 로그인하는 것을 의미합니다.

become 옵션은 sudo, su와 같이 root 권한이나 다른 유저의 권한으로 대상 호스트에서 명령을 실행할지 설정하는 것으로, 위 코드에서는 ubuntu 유저로 대상 호스트에 접근했지만, root 권한으로도 명령을 수행할 수 있도록 True로 옵션을 주었습니다.

 

09. Inventory

인벤토리 파일인 hosts는 다음과 같이 작성했습니다. 

mail.mad.com

[webservers]
foo.mad.com
bar.mad.com

[dbservers]
one.mad.com
two.mad.com
three.mad.com

 


10. main.yaml

다음은 타겟 호스트를 대상으로 명령어를 수행하는 main.yaml 파일을 작성해보겠습니다.

- name: Ansible apt module example
  hosts: all
    #    - webservers
    #    - dbservers
  roles:
    - apache

 

위 코드에서는 명령 세트의 이름을 Ansible apt module example로 정의했습니다. name 옵션은 alias 정도로 생각하시면 될 것 같습니다. hosts 옵션에서는 명령을 수행할 대상 호스트를 명시합니다. 주석 처리된 라인처럼 webservers나 dbservers같은 그룹명을 적어도 되지만, 본 예제에서는 all을 통해 전체 대상 호스트에 명령을 실행해보겠습니다.

 

아래의 roles는 roles 폴더 내의 구조화된 명령 파일을 의미하는 것으로, 현재 roles 폴더 내에 있는 apache와 nfs 중 apache 명령만을 수행하고 있습니다. roles 대신 바로 tasks를 작성할 수 있지만, 확장적인 유지보수를 위하여 폴더를 나눴습니다.

 

11. roles

/etc/ansible/roles/apache 경로 내부의 파일들을 하나씩 살펴보겠습니다.

 

tasks/main.yaml 파일 내용입니다.

- name : Apache Remove
  ansible.builtin.apt:
    name: apache*
    state: absent
    purge: true
    autoremove: yes
- name : Apache Install
  ansible.builtin.apt:
    name: apache2
    state: present
- name : Execution script
  ansible.builtin.script:
    cmd: "{{mad}}.sh"

 

vars/main.yaml 파일 내용입니다.

mad: info

 

files/info.sh 파일 내용입니다.

#!/usr/bin/env bash

touch $(date +%Y-%m-%d_%H:%M:%s)

 

위에서부터 차례대로 살펴보겠습니다.

 

apache role 내부에서는 총 Apache Remove, Apache Install, execution script 세 가지의 명령이 차례대로 수행됩니다. Apache remove에서는 apache가 접두사인 모든 프로세스를 삭제하고, Apache Install에서 apache2를 설치하며, 다음으로는 {{mad}}.sh 스크립트 파일을 실행합니다.

 

해당 명령에서는 {{mad}}로 mad라는 변수를 사용하고 있는데, ansible에서 해당 변수를 vars 경로에서 찾아내어 info를 대입합니다. 이런 식으로 관리하면 수행해야 할 스크립트가 바뀔 때 용이합니다. 이렇게 info.sh 파일이 실행되어 현재 시간이 출력되게 됩니다.

 

이제 아래의 명령어를 실행하면 apache role 내부의 명령이 수행됩니다.

ansible-playbook main.yaml

 


12. 맺음말

이렇게 ansible을 사용하여 여러 호스트에 한 번에 Apache2를 설치해보았습니다. OS에 따라 명령어를 변경하여 각기 다른 OS의 서버들을 오케스트레이션하는 것도 가능합니다. 위의 예제에서는 roles의 apache만 수행했지만, nfs 내부에도 비슷한 구조로 만들어 수행이 가능합니다.

 

또한 script와 vars 폴더 및 파일을 작성하여 모든 role에서 공통적으로 사용하는 스크립트 및 변수를 설정할 수도 있습니다.Ansible은 대규모 호스트 오케스트레이션에 특화된 기술이므로, 예제를 따라 꼭 한 번 체험해보시기 바랍니다.

 

예제를 따라하며 궁금한 점이 생기신다면, 댓글로 문의주세요!

그럼 지금까지 MC매드였습니다.