Ansible, 형상 관리!

xgro·2022년 9월 12일
0

DevOps

목록 보기
5/9

형상 관리 도구의 필요성

쉘 스크립트를 통해 인프라를 관리한다면, 코드의 재사용성을 위해 스크립트 작성시 한가지 리소스에 많은 조건문을 생각하여 구현해야 합니다.

멱등성 : 여러번의 스크립트 실행에도 동일한 결과를 만들기 위해서입니다.

	if [ 조건 1 ]; then
    	동작 1
    fi
    if [ 조건 2 ]; then
    	동작 2 
    fi
    else
    	동작 3
    fi
    ...

형상관리 도구를 사용하여 이러한 복잡한 작업을 단순화하여 인프라를 보다 안전하게 관리 할 수 있습니다.

Ansible이란?

Ansible은 하나의 워크스페이스에서 여러 서버를 효과적으로 관리할 수 있도록 도와주는 형상 관리 도구입니다.

다음과 같은 특징을 지니고 있습니다.

  • yaml 문법을 사용하여 인프라를 관리할 수 있습니다.
  • 멱등성을 보장하므로 여러번의 실행에도 동일한 결과를 도출합니다.
  • ssh / WinRM 프로토콜을 통해 통신하므로 각각의 대상 서버에 별도의 에이전트를 설치할 필요가 없습니다.
  • 동시에 다수의 서버를 관리할 수 있습니다.
  • 버전관리에 용이합니다.

Use case

  • CLOUD AUTOMATION
  • EDGE AUTOMATION
  • NETWORK AUTOMATION
  • SECURITY AUTOMATION
  • INFRASTRUCTURE
  • PROVISIONING
  • CONFIGURATION MANAGEMENT
  • APPLICATION DEPLOYMENT
  • CONTINUOUS DELIVERY
  • ORCHESTRATION
  • ENDPOINT PROTECTION

출처 - USE CASES

Ansible 기본 개념

인벤토리(inventory)

대상 서버 호스트를 관리하는 파일입니다.
일반적으로 ini 또는 yaml 파일의 형식을 이용해서 작성합니다.

mail.example.com

[webservers]
foo.example.com
bar.example.com

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

애드혹 명령어(ad hoc commands)

cli를 이용하여 앤서블을 동작시킬때 사용합니다. 코드를 재사용하기 힘드며, 거의 반복하지 않는 작업에 적합합니다.

$ ansible [pattern] -m [module] -a "[module options]"

모듈(module)

각 작업에 정의된 작업을 수행하기 위해 Ansible이 각 관리 노드(필요한 경우)에 복사하고 실행하는 코드 또는 바이너리 입니다. 다양한 모듈이 존재하므로 필요한 모듈을 적시에 잘 찾아서 사용하는것이 중요합니다.

플레이북(playbook)

Ansible-playbook은 반복가능하고 재사용 가능하며 간단한 구성 관리 및 다중 배포 시스템을 제공합니다.
yaml 파일로 작성하며 각각의 플레이는 하나의 작업 단위를 나타냅니다.
플레이북은 기본적으로 위에서부터 아래로 순서대로 실행됩니다. 개별 플레이 내에서도 작업이 절차적으로 실행됩니다.

---
- name: Update web servers
  hosts: webservers
  remote_user: root

  tasks:
  - name: Ensure apache is at the latest version
    ansible.builtin.yum:
      name: httpd
      state: latest
  - name: Write the apache config file
    ansible.builtin.template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf

- name: Update db servers
  hosts: databases
  remote_user: root

  tasks:
  - name: Ensure postgresql is at the latest version
    ansible.builtin.yum:
      name: postgresql
      state: latest
  - name: Ensure that postgresql is started
    ansible.builtin.service:
      name: postgresql
      state: started

핸들러(handler)

이벤트 기반으로 동작하는 작업입니다. 예를들어 Nginx 또는 Apache2 설정이 변경되었을때, 이를 감지하여 트리거를 발동하여 재시작할 수 있도록 도와줍니다.

유의할점
핸들러는 나열된 순서가 아니라 Section에 정의된 순서에 따라 실행됩니다.
동일한 핸들러에 여러 notify가 실행될 경우 태스크 수에 상관없이 한번만 동작합니다.

tasks:
- name: Template configuration file
  ansible.builtin.template:
    src: template.j2
    dest: /etc/foo.conf
  notify:
    - Restart apache
    - Restart memcached

handlers:
  - name: Restart memcached
    ansible.builtin.service:
      name: memcached
      state: restarted

  - name: Restart apache
    ansible.builtin.service:
      name: apache
      state: restarted

변수(variables)

앤서블은 Python을 기반으로 동작하기 때문에 Python 키워드 또는 Playbook에 명시된 키워드는 변수로 사용할 수 없습니다.
변수 이름은 밑줄을 이용하여 시작할 수 있습니다.
숫자는 변수로 가능하지만 변수의 제일 첫 문자를 숫자로 시작할 수 없습니다.

아래는 Ansible 에서 제시하는 유효한 변수의 이름과 잘못된 변수의 이름의 예 입니다.

Valid variable namesNot valid
foo*foo, Python keywords such as async and lambda
foo_envplaybook keywords such as environment
foo_portfoo-port, foo port, foo.port
foo5, _foo5foo, 12
profile
안녕하세요! DevOps 엔지니어 이재찬입니다. 블로그에 대한 피드백은 언제나 환영합니다! 기술, 개발, 운영에 관한 다양한 주제로 함께 나누며, 더 나은 협업과 효율적인 개발 환경을 만드는 과정에 대해 인사이트를 나누고 싶습니다. 함께 여행하는 기분으로, 즐겁게 읽어주시면 감사하겠습니다! 🚀

0개의 댓글