vi ~/.vimrc
syntax on
autocmd FileType yaml setlocal ai ts=2 sw=2 sts=2 et autoindent
set cursorcolumn
-> yaml 문서는 들여쓰기에 민감하므로 vim설정을 통해 들여쓰기를 맞추기 쉽게 설정한다<yaml 파일 작성시 주의 사항>
플레이북은 하나 이상의 플레이를 가지고 있으며, 플레이는 작업을 실행하기 위한 특정 관리 노드 또는 그룹을 지정
플레이에는 작업을 선언하며, 작업은 모듈을 호출
플레이북은 위에서 아래 순서대로 실행
YAML의 목록은 위에서 아래로 순서를 가짐
플레이북 기본 구조
작업 실행 순서
① Ansible은 기본적으로 호스트의 패턴과 일치하는 모든 시스템에 대해 각 작업을 순서대로 실행
② 각 작업은 지정한 모듈 옵션을 사용하여 모듈을 실행
③ 하나의 작업이 호스트 패턴과 일치하는 모든 시스템에서 완료되면 다음 작업으로 이동
④ 특정 호스트에서 작업이 실패하면 해당 호스트는 작업이 더 남아 있더라도 제외
📒 1->2->3->4의 작업 순서에서 3이 실패하면 4로 가지 않고 제외된다
작업 실행 멱등성
ansible-playbook playbook.yml
플레이북 실행ansible-playbook playbook.yml --syntax-check
구문 체크ansible-playbook playbook.yml --check
체크 모드1 . 간단한 디버깅 및 메세지 출력하는 플레이북
vi test1.yml # test1.yml파일 생성후 접속
---
- name: play1
hosts: AA
tasks:
- name: 1st task
debug:
msg: "1st task"
...
2 . 위의 플레이북에서 gathering fact 사용 안하는 플레이북
vi test2.yml # test2.yml파일 생성 후 접속
---
- name: play1
hosts: AA
gather_facts: no #0 false False FALSE
tasks:
- name: 1st task
debug:
msg: "1st task"
...
📒 Gathering Facts : Fact 라는 변수는 관리하는 대상의 기본 정보들을 담고 있는 변수
3 . 다중 모듈 : 작업에 대해서 여러 모듈을 실행
- name: 1st play
hosts: AA
gather_facts: 0
tasks:
- name: 1st task
command: id
register: result
- name: 2nd task
debug:
msg: "{{ result.stdout }}"
-> 첫번째 사진은 id의 결과를 "{{ result }}"로 다 출력한 것
-> 두번째 사진은 "{{ result.stdout }}"로 stdout만 뽑아내서 출력한 결과이다
4 . 다중 작업 : 플레이를 설정함으로써 여러 작업을 실행
- name: 1st play
hosts: ansi-node1
gather_facts: no
tasks:
- name: 1st play - lst task
command: id
register: result1
- name: 1st play - 2nd task
debug:
msg: "{{ result1.stdout }}"
- name: 2nd play
hosts: ansi-node2
gather_facts: no
tasks:
- name: 2nd play - 1st task
command: hostname
register: result2
- name: 2nd play - 2nd task
debug:
msg: "{{ result2.stdout }}"
-> ansi-node1에 대한 작업 결과
-> ansi-node2에 대한 작업 결과
1 . 변수 사용
- name: vars test
hosts: ansi-node1
vars:
var1: abc
var2: 123
tasks:
- name: string print
debug:
msg: "문자 출력 결과 {{ var1 }} \n 숫자 출력 결과 {{ var2 }} "
2 . 따옴표와 변수
- name: vars use syntax
hosts: ansi-node1
vars:
str1: "var test"
tasks:
- name: vars print1
debug:
msg: "{{ str1 }}---------" #변수를 문장의 앞에 오는 경우에는 반드시 따옴표로 쌓여 있어야함
- name: vars print2
debug:
msg: "-----{{ str1 }}----" #변수 참조가 문자의 중간이나 끝에 오는 경우에는 따옴표를 사용하지 않아도 사용 가능
- name: vars print3
debug:
msg: "----{{ str1 }}"
📗 왠만하면 따옴표로 변수를 감싸자
3 . 리스트 변수 사용
- name: list vars
hosts: ansi-node1
gather_facts: 0
vars:
list1:
- 1
- 2
- 3
tasks:
- debug:
msg: "{{ list1 }}"
- debug:
msg: "{{ list1[0] }}"
- debug:
msg: "{{ list1[1] }} {{ list1[2] }}"
4 . 딕셔너리 변수 사용
- name: dict vars
hosts: AA
gather_facts: 0
vars:
info:
name: Lee
age: 47
area: seoul
tasks:
- debug:
msg: "{{ info }}"
- debug:
msg: "{{ info.name }} , {{ info.age }} , {{ info.area }}"
- debug:
msg: "{{ info['age'] }} , {{ info.area }}"
📗 info.name = info['name']
5 . 등록 변수 사용
- name: register vars
hosts: ansi-node1
gather_facts: 0
tasks:
- name: Input register vars
command: "ls -la /home/vagrant"
register: result
- name: Output register vars
debug:
msg: "{{ result }}"
5-1 . 위의 플레이북 마지막줄에 추가
- name: register vars stdout_lines
debug:
msg: "{{ result.stdout_lines[0:-1] }}"
-> 인덱스 슬라이싱을 통해 stdout_lines의 마지막줄을 제외한 나머지 줄이 출력되는 것을 확인
6 . 인벤토리 호스트 변수 사용
cp inventory inventory_vars # 기본인벤토리 복사본 생성
vi inventory_vars # 복사본에 접속 후 아래처럼 수정
[all]
ansi-master1
[AA]
ansi-node1 port=80
ansi-node2 port=8080
[BB]
ansi-node2
ansi-node3
[CC]
ansi-node1
ansi-node3
[ABC:children]
AA
BB
vi inven_host_vars1.yml # 플레이북 생성후 아래 처럼 작성
- name: inven host vars
hosts: AA
tasks:
- debug:
msg: "{{ port }}"
ansible-playbook inven_host_vars1.yml -i inventory_vars
플레이북 실행시 위의 사진처럼 호스트변수의 port가 출력됨을 확인
📗 기본 인벤토리가 아닌 복사본 인벤토리이므로 -i 옵션으로 인벤토리를 지정해줘야한다
인벤토리에 그룹변수로 port를 정의해도 호스트변수가 있다면 호스트변수에 정의된 port가 출력된다. 마찬가지로 /group_vars에 정의된 port보다 /host_vars에 정의된 port가 우선적으로 출력된다. 여기에 플레이북에 port가 정의되어 있다면 우선적으로 출력된다. 이처럼 변수에는 우선순위가 존재한다
# inventory 파일 수정
[AA]
ansi-node1 var1=1000
ansi-node2
[AA:vars]
var1=2000
# yml파일 작성
- name: vars
gather_facts: 0
hosts: AA
tasks:
- debug:
msg: "{{ var1 }}"
-> ansi-node1은 inventory에서 var1이 호스트변수, 그룹변수로 정의되었고, ansi-node2는 그룹변수로 var1이 정의되었다.
따라서 yml 파일에서 그룹 AA를 대상으로 변수를 출력했을 때
ansi-node1의 호스트변수가 우선이 되어 1000이 출력되고 ansi-node2는 그룹변수만 정의되어있기 때문에 2000이 출력됨을 알 수 있다.
<변수 정의 위치에 대한 팁>