앤서블 플레이북은 어떤 호스트에서 어떤 작업을 실행시킬 지 명시하는 Yaml 기반 파일을 뜻한다. 자동화 작업 스크립트를 플레이북이라고 한다.
플레이북 작성 시에 크게 다음 3개의 부분으로 나뉘어진다.
실행 장비 및 어떤 사용자 등 명시하는 부분
- hosts: localhost
user: root
플레이북에서 사용 가능한 변수 정의하는 부분
vars:
motd_warning: 'WARNING: Use by ACME Employess ONLY'
플레이북에서 항상 사용 가능한 일부 변수를 정의한다.
실행하고 싶은 액션을 적는 부분
tasks:
- name: setup a MOTD
copy: dest=/etc/motd content={{ motd_warning }}
앤서블에 의해 패키징된 액션 (대략 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
...
Ansible의 role은 플레이북을 여러 파일로 분할하여 관리하고 실행시킬 수 있는 일종의 유지보수를 고려한 체계화이다.
여러 파일으로 분할함으로써 플레이북을 목적에 맞게 모듈화 할 수 있고, 재사용 이 원활해 진다.
디렉토리 별로 역할을 정의하고 분리한다.
기본적으로 모든 Role은 ansible이 참조할 수 있도록 "roles" 디렉토리내에 존재해야한다.
따라서 특정 요구사항이 있는 경우가 아니라면 /etc/ansible/roles 디렉토리내에 Role을 정의한다.
/etc/ansible/roles
ansible.cfg 파일의 default의 roles_path를 수정해주면 된다.
[default]
roles_path = ~/ansible_roles
ansible-galaxy init {Role Name}
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이 없으면 에러가 발생합니다.
기본적인 규칙은 roles 디렉토리 내부에서 사용되지만
해당 실행 playbook yml 파일의 동일 위치에서 존재하는 디렉토리 명으로
role을 지정해주면 동일하게 role이 실행된다.
해당 role의 tasks 디렉토리 내부에 main.yml을 찾아 실행
main.yml이 아닌 다른 이름일 경우 파일을 찾지 못해 실행되지 않음
ansible-playbook playbook.yml
Role 실행 시 실행 전, 후로 실행될 Task 명령을 작성할 수 있다.
pre-tasks
post-tasks
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"