Ansible Playbook

Violet_Evgadn·2023년 4월 25일
0

CI&CD 자동화

목록 보기
18/28

Ansible Playbook 구조

Ansible Playbook 작성을 조금 더 쉽게 하려면 Ansible Playbook 구조를 알아두면 좋다.

Ansible Playbook은 위 사진과 같은 구조를 하고 있는데 이를 Playbook - Play - Tasks 구조라고 한다.(네이밍 센스 무엇..)

먼저 Playbook은 Ansible Playbook File 1개를 의미한다.

우리는 Ansible Playbook을 활용하여 일괄적으로 모든 Ansible Node들에게 원하는 서버 설정을 적용할 수 있다.

Playbook은 1개 혹은 여러 개의 Play로 이루어져있다.

Play는 설정해야 하는 여러 개의 Infra 설정 중 Infra 1개에 대한 설정을 의미한다.

Play는 1개 혹은 여러 개의 Task들로 이루어져 있다.

Task에는 1개의 Infra 설정을 어떤 방식으로 수행해야 할지 명시한다. Task에서는 이전에 배웠던 Ansible Module을 활용함으로써 Ansible이 Infra 설정을 어떻게 수행해야 하는지 알 수 있다.

개념만 들으면 이해가 살짝 어려울 수도 있으니 예시를 들어보자.

나는 모든 Ansible Node에 DB, Tomcat, 그리고 Log 저장을 위한 Directory를 만들고 싶다고 가정하자.

Tomcat 설정을 위해서는 먼저 Tomcat을 설치하고 설치한 Tomcat을 실행시켜야 한다. 이때 Tomcat을 설치하는 과정, Tomcat을 실행시키는 과정 각각을 "Task"라고 한다.

그리고 이렇게 2개 Task가 모여 "Tomcat이 실행된다"라는 1개의 Infra 설정이 완료된다. 이를 Play라고 한다.

DB 설치에 대한 Play, Tomcat 설치에 대한 Play, Log를 위한 Directory 생성에 대한 Play가 모두 수행된다면 우리가 원하는 서버 설정이 완료될 것이다. 이렇게 3개의 Play가 모아 놓은 파일을 Playbook이라고 하는 것이다.

여기에서 다시 확인하고 넘어가야 할 것은 Task를 만들 때 Ansible Module을 활용한다는 것이다.

Ansible Module을 잘 알아야 서버 설정을 더 폭넓게 할 수 있으므로 Ansible Module에 대해 잘 알아두자.

Ansible Module Documentation


Ansible Playbook을 활용한 멱등성 확인

Ansible의 특징 중 하나는 멱등성을 가진다는 점이다.

다시 한번 멱등성을 확인하고 가자면 동일한 명령이 여러 번 수행되더라도 1번의 요청을 보낸 것과 동일한 효과를 가지는 특성을 말한다.

그렇다면 Ansible Playbook을 통해 Ansible이 멱등성의 특징을 가지는지 확인해보자.

1. Ansible-Server 접속 & first-playbook.yml 파일 만들기

vi first-playbook.yml

first-playbook.yml 파일에 입력할 내용은 아래와 같다.

---
- name: Add an ansible hosts
  hosts: localhost
  tasks:
    - name: Add an ansible hosts
      blockinfile:
        path: /etc/ansible/hosts
        block: |
            [mygroup]
            172.17.0.5

흔히 보던 yml 파일 형식임을 알 수 있다. yml 파일의 Key가 각각 어떤 의미를 가지는지 확인하고 넘어가자.

  • name : 수행할 작업 이름
  • host : 작업을 수행하게 할 Ansible Node
    • localhost : Ansible Server
    • all : host 파일에 적혀 있는 모든 IP Address
    • host 파일에 [devops] 등으로 IP Address들이 Group Name을 통해 묶여 있다면 devops Group Name을 입력하여 원하는 Ansible Node Group에만 설정을 적용할 수 있다.
  • task : 수행할 작업(Task)

Ansible Playbook 구조를 통해 생각해보자면 가장 상단에 있는 "-name: Add an ansible hosts"가 1개의 Play가 될 것이다.

그리고 이 Play를 위해 수행해야 할 작업이 tasks 밑에 있는 "-name: Add an ansible hosts"가 될 것이고, 이것이 Playbook의 Task가 될 것이다.

이를 통해 알 수 있는 Ansible Playbook 생성 방법은 아래와 같다.

먼저 가장 상위 계층에 -name을 통해 Play 1개를 선언한다. 이후 해당 Play를 어떤 Ansible Node에 적용할지 "hosts" Parameter를 통해 알려준다.

이후 "tasks" 아래에 Play를 구현하기 위한 방법, 즉 Task를 순서대로 기입하면 되는 것이다. Task를 추가할 때도 -name을 통해 1개의 Task를 묶어주고 묶어준 Task에 대하여 이름을 붙여주면 Ansible Playbook 생성이 끝난 것이다.

(아래 추가적인 실습에서 Ansible Playbook 생성 방법을 계속 곱씹으며 실습해보자)

이젠 Task 작성 방법에 대해 알아보자.

우리는 위에서 Ansible Module을 활용해 Task를 작성한다고 배웠다. 만약 이 말이 사실이라면 위에 있는 Ansible Playbook Task의 "blockinfile"이라는 Module이 존재해야 할 것이다.

정답! 즉, 우리는 Task를 Ansible Module을 활용함으로써 작성할 수 있음을 알 수 있다.

최종적으로 정리한 Ansible Playbook 형식은 아래와 같다.

---
# 첫번째 play
- name : [첫번째 Play Name]
  hosts : [첫번째 Play를 적용할 Ansible Node]
  tasks :
    - name: [첫번째 Task name]
      [Ansible Module Name]:
         [Ansible Parameter] : [Ansible Parameter Value]
         [Ansible Parameter2] : |
         	[Ansible Parameter2 Value]
         ...
    - name : [두번째 Task name]
    ...


# 두번째 play
- name : [두번째 Play Name]
...

[Ansible Parameter]처럼 Value를 Parameter 옆에 적어주는 것이 아니라 [Ansible Parameter2]처럼 Value를 Parameter 아랫부분에 적고 싶다면 꼭 "|"(Shift + )을 붙여줌으로써 Parameter 아래 있는 부분이 Ansible Parameter Value임을 명시하자.

또한 중요한 점은 "[Key] : [Value]" 값을 설정할 때 [Key]와 ":"는 붙어있어도 되지만 ":"와 [Value] 사이에는 꼭 띄어쓰기(공란)를 하나 만들어줘야지만 정상 실행이 된다.

위 모든 사항을 정리해본다면 Ansible 측에서 "[mygroup]\n172.17.0.5"라는 문자열(Text Block)을 특정 파일(/etc/ansible/hosts)에 Insert 할 것이라고 추측할 수 있다.

2. Ansible Playbook 실행시키기

ansible-playbook [Playbook(YAML 파일) 이름]
Playbook을 실행시키는 명령어는 위와 같이 간단하다.

그렇다면 직접 실행시켜 우리가 원하는 작업이 수행되는지 살펴보자.

위 사진에서 볼 수 있듯 /etc/ansible/hosts에 내가 원하는 문자열이 추가되었음을 알 수 있다.(# ~ # 부분)

3. Ansible Playbook 재실행

이제 Ansible Playbook을 다시 실행시켜 Ansible의 멱등성을 확인해보자.

Ansible Playbook을 재실행시켰음에도 불구하고 새롭게 문자열이 추가되지 않았음을 볼 수 있다.

즉, 멱등성을 가짐을 확인할 수 있다.


Tomcat9 다운로드

Tomcat9를 다운로드하기 위해선 먼저 다운로드한 Tomcat9 파일을 저장할 Directory를 생성해야 한다.

또한 Tomcat을 설치한 이후 파일이 올바르게 설치되었는지 확인할 필요가 있다. 이를 위해 "checksum"이라는 것을 활용하여 설치된 파일의 무결성을 보장해야 할 필요성이 있다.

따라서 Tomcat Checksum을 설치하고 설치한 Checksum을 등록하여 Tomcat 설치 이후 등록된 Checksum으로 파일 무결성을 확인하는 과정이 추가된다.

즉, 총 4개의 Task가 수행되어야 하는 것이다. 이 과정을 Ansible-Playbook을 통해 수행해보자.

---
- name: Download Tomcat9 from tomcat.apache.org
  hosts: devops
  tasks:
   - name: Create a Directory /opt/tomcat9
     file:
       path: /opt/tomcat9
       state: directory
       mode: 0755
   - name: Download the Tomcat checksum
     get_url:
       url: https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.68/bin/apache-tomcat-9.0.68.tar.gz.sha512
       dest: /opt/tomcat9/apache-tomcat-9.0.68.tar.gz.sha512
   - name: Register the checksum value
     shell: cat /opt/tomcat9/apache-tomcat-9.0.68.tar.gz.sha512 | grep apache-tomcat-9.0.68.tar.gz | awk '{ print $1 }'
     register: tomcat_checksum_value
   - name: Download Tomcat using get_url
     get_url:
       url: https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.68/bin/apache-tomcat-9.0.68.tar.gz
       dest: /opt/tomcat9
       mode: 0755
       checksum: sha512:{{ tomcat_checksum_value.stdout }}"

수행하는 작업은 아래와 같다.

  • Create Directory : Tomcat9를 다운로드할 Directory를 설치한다
  • Download the Tomcat checksum
    • HTTP, HTTPS, 혹은 FTP를 통해 파일을 다운로드한다
    • checksum 파일을 다운로드하여 /opt/tomcat9/apache-tomcat-9.0.68.tar.gz.sha512 파일로 저장한다
  • Register the checskum value
    • 위에서 다운로드한 checksum 파일 중 Tomcat9 설치에 대한 Checksum을 등록함
  • Download tomcat
    • Tomcat을 다운 받은 뒤 등록했던 Checksum을 통해 파일의 무결성을 검증한다

이때 "register"을 유심히 볼 필요가 있다.

이미 "shell"이라는 Ansible Module을 활용했는데 또다시 "register"라는 문구가 추가되었다. 검색해보면 알 수 있듯 "register"는 Ansible Module이 아니다. 그렇다면 왜 나온 걸까?

이는 "Ansible Playbook variables"라는 것이다. 이 Ansible Variables를 통해 Ansible Module에서 수행했던 결과물에 대하여 추가적인 작업을 수행할 수 있게 된다.

Ansible Playbook Variables Documentation

"register"는 Play 내에서 사용할 수 있는 변수를 등록하는 Variables이다.

이렇게 등록한 변수는 {{Variable Name}}을 통해 활용할 수 있다.

위 Ansible Playbook의 3번째 Task는 단순히 Shell 명령어를 통해 파일에서 Checksum 값을 찾아 출력하는 명령이다.

하지만 3번째 Task에서 단순히 Checksum을 출력만 한다면 4번째 Task에서 Checksum을 활용할 방법이 없다.

이 때문에 3번째 Ansible Playbook에서 출력될 checksum을 "tomcat_checksum_value"라는 변수로 저장하여 4번째 Task에서 {{tomcat_checksum_value.stdout}}을 통해 활용할 수 있도록 만든 것이다.

이렇게 생성한 Playbook을 명령어를 통해 실행시키자

ansible-playbook second-playbook.yml

위 사진에서 볼 수 있듯 원래는 /opt/tomcat9 디렉터리가 존재하지 않았지만 Ansible Playbook 실행 이후 opt/tomcat9 Directory가 생성되고 apache-tomcat 관련 파일 2개(Tomcat 파일, Checksum 관련 파일)가 설치되었음을 확인할 수 있다.

profile
혹시 틀린 내용이 있다면 언제든 말씀해주세요!

0개의 댓글