Ansible에 대해서 찍먹만 해보다가 제대로 학습을 해보기로 한다.
주요 특징은
디테일한 문법 소개 보다는 어떤 구조를 가지고 있는지와 주의해서 사용해야 할 특징을 공유한다.
한마디로 말하면 애플리케이션 및 IT 인프라를 자동화 할 수 있는 도구라고 할 수 있다.
Ansible을 사용하면
에이전트리스이고 OpenSSH기반으로 컨트롤노드 <-> 관리노드간에 통신을 한다.
▪ Ansible의 작업 실행 단위
▪ 하나의 모듈이 하나의 작업이 되며, Ad-hoc 명령을 통해 단일 작업을 실행하거나, 플레이북을
▪ 특정 관리 노드를 대상으로한 순서가 지정된 작업(task)의 목록
▪ 관리 노드에서 실행할 모듈을 인자와 함께 정의한 파일
▪ YAML로 작성되며, Ansible의 핵심
▪ ansible-playbook 명령을 이용해 플레이북을 실행할 수 있음
Ansible을 공부하며 중요하게 여겨졌던 부분들을 공유한다.
$ ansible-playbook playbook.yml --check
체크 모드
--syntax-check와는 다르다!
운영체제 등의 메타데이터 정보를 수집하는것
정보를 가지고 있는것을 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', '>')
same_file 은 마스터노드와 관리노드 상의 파일끼리의 비교임.
파이프라인과 bool 을 사용하면 문자열로 들어온 "yes", "no" 등의 문자열을 부울타입으로 변환 가능함.
플레이북 사용 예시
var1 = "no"
when: var1 | bool >> 참, 타스크 실행
when: var1 >> 거짓, 타스크 스킵
▪ 핸들러는 항상 플레이의 handlers 섹션에서 지정한 순서대로 실행
핸들러는 모든 작업이 끝나야 수행됨. 작업 중간에 에러가 나서 모든 작업이 수행되지 않으면 핸들러도 수행되지 않음
핸들러는 notify에서 명시한 순서가 아니고, 핸들러에서 명시한 순서대로 수행된다.
handlers:
- name: tasks1
import_tasks: tasks/handler.yaml
include 하면 파일명을 notify 하고 모두 실행됨
import 하면 핸들러명을 notify하고 개별 실행 가능
위임 사용 시 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 }}"
출력