[Ansible] Ansible 기초 및 주요 특징

Seunghyun Moon·2023년 8월 25일
0

Ansible에 대해서 찍먹만 해보다가 제대로 학습을 해보기로 한다.
주요 특징은

  • python 문법을 알거나 써봤다면 익숙하게 본 것들이 자주 나온다.
    • 메소드호출방법이라든지 jinja2 템플릿을 활용하는 것들 같이
  • yaml 형식을 따른다.

디테일한 문법 소개 보다는 어떤 구조를 가지고 있는지와 주의해서 사용해야 할 특징을 공유한다.

Ansible

개념

한마디로 말하면 애플리케이션 및 IT 인프라를 자동화 할 수 있는 도구라고 할 수 있다.
Ansible을 사용하면

  • 호스트를 구성하고,
  • 소프트웨어를 배포하고,
  • 지속적인 배포 및 다운 타임 없는 롤링 업데이트
    등을 할 수 있다.

에이전트리스이고 OpenSSH기반으로 컨트롤노드 <-> 관리노드간에 통신을 한다.

용어

컨트롤 노드

  • Ansible이 설치된 호스트(마스터라고 할 수 있을것 같다.)
  • Python 설치 필요, 윈도우는 불가능.

관리 노드

  • 컨트롤 노드의 컨트롤 대상

플러그인

  • Ansible의 핵심 기능을 확장할 수 있도록 다양한 플러그인을 제공
  • Action, Become, Cache, Callback, Cliconf, Connection, Httpapi, Inventory, Netconf, Lookup, Shell, Strategy, Vars

인벤토리

  • 관리 노드의 목록으로, 관리 노드에 대한 호스트 이름이나 IP 주소와 같은 정보를 지정
  • 여러 관리 노드를 그룹으로 조직화 할수 있고, 중첩 그룹을 사용할 수 있음

모듈

  • Ansible을 실행하는 Python 코드 단위
  • 각 모듈은 호스트에 패키지를 설치 및 관리하고, 데이터베이스의 사용자를 관리하고, 네트워크
    장치의 VLAN 인터페이스를 관리할 수 있는 등 약 3000개의 모듈이 있음
  • 하나의 모듈은 하나의 작업을 실행할 수 있고, 플레이북을 이용해 여러 모듈을 선언해 여러 작업을 수행할 수 있음

작업(Task)

▪ Ansible의 작업 실행 단위
▪ 하나의 모듈이 하나의 작업이 되며, Ad-hoc 명령을 통해 단일 작업을 실행하거나, 플레이북을

플레이

▪ 특정 관리 노드를 대상으로한 순서가 지정된 작업(task)의 목록

플레이북

▪ 관리 노드에서 실행할 모듈을 인자와 함께 정의한 파일
▪ YAML로 작성되며, Ansible의 핵심
▪ ansible-playbook 명령을 이용해 플레이북을 실행할 수 있음

주요 특징

Ansible을 공부하며 중요하게 여겨졌던 부분들을 공유한다.

플레이북 작업 순서

  • 하나의 작업이 호스트 패턴과 일치하는 모든 시스템에서 완료돼야 다음으로 이동
  • 작업 중간에 특정 호스트에서 실패하면 그 호스트에서는 이후 작업 수행 않음. 다른 호스트는 계속 수행함

check 모드는 dry run임

$  ansible-playbook playbook.yml --check

체크 모드

  • 체크 모드는 모의 테스트(dry run)로 시뮬레이션을 진행
  • 체크 모드는 관리 노드를 변경하지 않고 실행하고 모듈은 변경 사항을 보고함
  • 검사모드를 지원하지 않는 모듈은 아무것도 보고하지 않으며 실행하지도 않음
    주의점: 플레이 사이에서 중간 결과물들은 만들어지지 않기때문에 중간결과물을 활용하는플레이가 있다면 에러나면서 모든 작업에 대해 수행되지는 않음

--syntax-check와는 다르다!

Gathering Facts란

운영체제 등의 메타데이터 정보를 수집하는것
정보를 가지고 있는것을 facts라고 부름
gather_facts = falst or 0으로 주면 수집하지 않음

팩트변수 사용법

{{ ansible_hostname }}
{{ ansible_facts.ansible_hostname }}
{{ ansible_facts['ansible_hostname'] }}

반복문

패키지 설치 시 반복문 사용 안해도 됨

apt 모듈은 설치 패키지 이름을 리스트로 받을 수 있기 때문에 굳이 반복문을 사용할 필요가 없음
생각해보면 bash scripting 등에서도 한번에 설치함

$ yum install -y apache2 firewalld

플레이북 사용 예시

-vars:
  pkgs:
  - firewalld
  - apache2
-apt
  name: "{{ pkg }}"

loop 이용하면 커맨드라인 세줄 치는것
apt -y install firewalld apache2
리스트로 전달하면 한줄로

조건문

대략적인 형태

플레이북 사용 예시

- debug:
       msg: "{{ item }}"
     loop:
     - a
     - b

- debug:
       msg: "{{ item }}"
     loop:
     - "{{ list1 }}"

버전 비교

버전은 텍스트로 비교가 되서 힘든 경우도 있는데,
version 키워드를 제공해서 비교를 간단하고 가독성있게 만들어준다.
플레이북 사용 예시

vars:
  my_version: 1.2.3
tasks:
  - debug:
      msg: "my_version is higher than 1.0.0"
    when: my_version is version('1.0.0', '>')

is same_file(file)

same_file 은 마스터노드와 관리노드 상의 파일끼리의 비교임.

| bool

파이프라인과 bool 을 사용하면 문자열로 들어온 "yes", "no" 등의 문자열을 부울타입으로 변환 가능함.
플레이북 사용 예시

var1 = "no"
when: var1 | bool >> 참, 타스크 실행
when: var1  >> 거짓, 타스크 스킵

핸들러

핸들러 사용시 주의 사항

▪ 핸들러는 항상 플레이의 handlers 섹션에서 지정한 순서대로 실행

  • 작업의 notify 문에 따라 나열한 순서나 작업이 핸들러에 통지하는 순서대로 실행되지는 않음.
    ▪ 핸들러는 일반적으로 플레이에서 다른 모든 작업이 완료된 후에 실행
  • 플레이북의 tasks 부분의 작업에서 호출한 핸들러는 tasks 아래에 있는 모든 작업이 처리될 때까지 실행되지 않음
    ▪ 핸들러 이름은 글로벌 네임스페이스에 있음.
  • 두 핸들러에 같은 이름이 잘못 지정되면 한 핸들러만 실행
    ▪ 둘 이상의 작업에서 한 핸들러에게 알리는 경우 해당 핸들러가 한번만 실행
  • 작업에서 핸들러에게 알리지 않는 경우 핸들러가 실행되지 않음.
    ▪ notify문을 포함한 작업이 chaged 결과를 보고하지 않으면 핸들러에 알리지 않음
  • 다른 작업에서 이 핸들러에게 알라지 않으면 이 핸들러를 건너띔
  • Ansible은 작업이 change 상태를 보고하는 경우에만 핸들러에게 알림.
    ▪ 핸들러는 작업이 제어노드를 변경할 때 추가 조치를 수행하기 위한 것으로 정상적인 작업을 대체하기 위해서
    사용해서는 안됨.
    ▪ 핸들러는 작업의 알림과 핸들러의 이름이 일치해야지만 알림을 받을 수 있기 때문에 핸들러의 작업에는
    반드시 이름을 선언해야 함.

핸들러는 모든 작업이 끝나야 수행됨. 작업 중간에 에러가 나서 모든 작업이 수행되지 않으면 핸들러도 수행되지 않음
핸들러는 notify에서 명시한 순서가 아니고, 핸들러에서 명시한 순서대로 수행된다.

핸들러를 include vs import

handlers:
-  name: tasks1
  import_tasks: tasks/handler.yaml

include 하면 파일명을 notify 하고 모두 실행됨
import 하면 핸들러명을 notify하고 개별 실행 가능

위임(Delegation)

delegate_facts

위임 사용 시 delegate_to를 사용하지만 delegate_facts 사용 시 유의해야한다.

플레이북 예시

- name: delegate_facts
  hosts: ansi-node1
  tasks:
  - name: ansi-node1 fact
    debug:
      msg: "{{ ansible_hostname }}"

  - name: gathering fact 1
    setup:
    delegate_to: ansi-node2

  - name: ansible_hostname print 1
    debug:
      msg: "{{ ansible_hostname }}"

  - name: gathering fact 2
    setup:
    delegate_to: ansi-node3
    delegate_facts: yes

  - name: ansible_hostname print 2
    debug:
      msg: "{{ ansible_hostname }}"

- name: 2play
  hosts: ansi-node3
  gather_facts: no
  tasks:
  - debug:
      msg: "{{ ansible_hostname }}"

- name: 3play
  hosts: ansi-node2
  gather_facts: no
  tasks:
  - debug:
      msg: "{{ ansible_hostname }}"

출력

profile
I live fullest

0개의 댓글

관련 채용 정보