앤서블(Ansible) 플레이북

Donghyun Kim·2023년 3월 8일
0
post-thumbnail

플레이북

앤서블 플레이북은 어떤 호스트에서 어떤 작업을 실행시킬 지 명시하는 Yaml 기반 파일을 뜻한다. 자동화 작업 스크립트를 플레이북이라고 한다.
플레이북 작성 시에 크게 다음 3개의 부분으로 나뉘어진다.

  • 타깃
  • 변수
  • 태스크

타깃

실행 장비 및 어떤 사용자 등 명시하는 부분

- hosts: localhost
user: root
  • 줄의 처음은 대시(-)로 시작해야한다.
  • 플레이가 실행되는 장비는 hosts의 값으로 설정
  • 플레이북에서 장비에 연결할 사용자가 누구인지 지정

변수

플레이북에서 사용 가능한 변수 정의하는 부분

vars:
  motd_warning: 'WARNING: Use by ACME Employess ONLY'
  • 인벤토리에서 설정한 항목이 오버라이드 될 수 있다.
  • vars_files 지시자를 사용해서 외부 Yaml 파일에서도 읽을 수 있다.
  • 대화형으로 사용자에게 변수 값을 입력 받을 수도 있다.

내장 변수

플레이북에서 항상 사용 가능한 일부 변수를 정의한다.

태스크

실행하고 싶은 액션을 적는 부분

tasks:
  - name: setup a MOTD
  copy: dest=/etc/motd content={{ motd_warning }}
  • 원하는 순서대로 수행 할 액션 목록을 포함
    • Name : 어떤 플레이인지 설명
    • Become : true인 경우 root 사용자가 되어 작업한다.

모듈

앤서블에 의해 패키징된 액션 (대략 200여개)
-> apt, shell, register, msg, copy, file 등


플레이북 사용하기

플레이북 실행 명령어

ansible-playbook example.yaml

플레이북 실행 결과

Task : [example] ***********************************

Change : [testserver]

Ok : [testserver]

Change는 호스트 값의 상태와 매개변수의 차이가 있으니, 변경 적용하는 액션을 했다!
OK는 호스트 값과 매개변수의 상태가 동일하다. 따라서 아무 액션도 하지 않는다!

주요 옵션

  • -i : 인벤토리(플레이북을 수행할 대상지/호스트) 지정
    ansible-playbook -i hosts.yml playbook.yml

  • -e : 추가 변수를 지정 키=값 형태 또는 파일로 할당한다.
    ansible-playbook -e "src=/src dest=/dest" copy.yml

주요 모듈

  • name : 작업명(생략 가능)
  • gather_facts : 작업 시작 전 대상지의 자원 정보 수집 여부
  • become : 권한을 변경한다.
  • hosts : 해당 모듈을 적용할 인벤토리 지정
  • debug : 변수를 콘솔에 출력할 수 있다.
  • register : 플레이북에서의 결과를 변수로 정하기 위해 사용
  • when : 작업 수행 조건, 특정 조건에서만 실행 할 때 사용
  • shell : shell script를 실행한다.
  • stat : 파일이나 시스템의 상태를 확인한다.
  • file : 파일 관련 작업을 수행한다.

플레이북 예제

디렉토리 생성

---
- name: mkdir
  gather_facts: no
  hosts: all
  tasks:
    - name: make dir
      file: 
        path: /home/dir
        state: directory
...

파일 복사

---
- name: copy
  gather_facts: no
  become: true
  hosts: all

  tasks:
    - name: Checking Service File
      stat: path=./src/my-process
      register: stat_service 

    - debug: msg="File Exist"
      when: stat_service.stat.exists

    - name: Copy Service File
      shell: cp ./src/my-process ./dest
      when: stat_service.stat.exists
... 

플레이북 롤(Role)

Ansible의 role은 플레이북을 여러 파일로 분할하여 관리하고 실행시킬 수 있는 일종의 유지보수를 고려한 체계화이다.

여러 파일으로 분할함으로써 플레이북을 목적에 맞게 모듈화 할 수 있고, 재사용 이 원활해 진다.

Role 구조

디렉토리 별로 역할을 정의하고 분리한다.

기본 작성법

기본적으로 모든 Role은 ansible이 참조할 수 있도록 "roles" 디렉토리내에 존재해야한다.
따라서 특정 요구사항이 있는 경우가 아니라면 /etc/ansible/roles 디렉토리내에 Role을 정의한다.

default path

/etc/ansible/roles

default path 수정 방법

ansible.cfg 파일의 default의 roles_path를 수정해주면 된다.

[default]
roles_path = ~/ansible_roles

Role의 기본 구조 생성

ansible-galaxy init {Role Name}

Role 사용

playbook을 실행할 yml 파일 내부에서 다음과 같이 roles에 role명을 작성하여주면 해당 role을 기반으로 playbook이 실행된다.

---
- hosts:
  - test
  roles:
    - role: {Role Name}

실행될때 내부적으로 다음 위치에서 role을 찾습니다.
./roles, /home/ansible/.ansible/roles, /usr/share/ansible/roles, /etc/ansible/roles
해당 위치에 적절한 role이 없으면 에러가 발생합니다.

간단하게 Role 사용하기

기본적인 규칙은 roles 디렉토리 내부에서 사용되지만
해당 실행 playbook yml 파일의 동일 위치에서 존재하는 디렉토리 명으로
role을 지정해주면 동일하게 role이 실행된다.

해당 role의 tasks 디렉토리 내부에 main.yml을 찾아 실행
main.yml이 아닌 다른 이름일 경우 파일을 찾지 못해 실행되지 않음

  • playbook 실행 위치
  • playbook.yml 내용
  • setting/tasks/main.yml
  • playbook.yml 실행
ansible-playbook playbook.yml

Role 사전/사후 Task 지정

Role 실행 시 실행 전, 후로 실행될 Task 명령을 작성할 수 있다.

  • 사전 실행 Task 명령어
    pre-tasks
  • 사후 실행 Task 명령어
    post-tasks

사전/사후 Task 예시

Ex. 사전에 apt 캐시 업데이트 & 사후에 slack 채널에 알림 발송

- Name: deploy mezzanine on vagrant
  Hosts: web
  Vars_files:
   - secret.yml
  Pre_tasks:
   - name: update the apt cache
     apt: update_cache=yes
  Roles:
   - role: mezzanine
     database_host:"{{ hostvars.db.ansible_eth1.ipv4.address }}"
     live_hostname: 192.168.33.10.xip.io
     domains:
      - 192.168.33.10.xip.io
      - www.192.168.33.10.xip.io
  Post_tasks:
   - name: notify slack
     local_action: >
       slack
       domain=xxx.slack.com
       token={{ slack_token }}
       msg="web server {{ inventory_hostname }} configured"
profile
"Hello World"

0개의 댓글