1. Playbook 구조
Playbook - play 집합
playbook - play - task 구조
playbook
play 집합
play
managed node에 적용할 여러 작업 코드 집합
한 번에 일괄적으로 수행할 작업 단위 -> task 모음
task
실제 수행할 작업 내용 -> 모듈로 표현
Playbook의 play 코드 구조
---
playbook 문서 시작
타깃 부분 : play에 대한 공통 정보 (필수 사항)
실행 장비, 사용자 정보 등
- name 속성
- play가 어떤 목적을 가지는지 설명하는 내용
- playbook 실행시 출력되는 내용
- 생략 가능
- hosts 속성
- host 이름; play가 적용될 managed node에 대한 이름
- 인벤토리에 정의된 이름 사용
- user 속성
- become 속성
- 관리자 권한으로 권한 상승 유무 명시
- play 차원에서 관리자 권한 상승 유무 명시
- become_user 속성
- 관리자 권한을 갖는 사용자 명시
- play 차원에서 관리자 권한을 갖는 사용자 명시
- gather_facts 속성
- managed node에 대한 fact 정보 수집 유무 확인
- default : gather_facts: True
- fact 정보 : managed node에 대한 정보
- managed node에 대한 fact 정보 수집 활성화할 시 동작 속도 느려짐
변수 부분 (선택 사항)
play 전체에서 사용하는 변수 목록
변수 부분을 변수 사용시에만 기술되는 부분 (생략 가능)
- vars : 변수 부분
- vars_files : 변수를 가지고 있는 외부 파일 기술 부분
태스크 부분 : task (필수 사항)
실제 수행할 모듈, managed node에서 수행한 모듈 명시
- name task 속성
- 태스크에 대한 설명
- name 속성의 내용을 기술하지 않아도 되지만 실제로는 항상 기술
Playbook - play - role 구조
role
불필요하거나 중복되는 소스를 제거하고 자주 사용하는 기능을 재사용하기 위해 사용하는 task 코드 집합
YAML 형식으로 작성
- 라이브러리 (Library)
- 통상 프로그래밍 언어에서 함수(function)를 모아놓은 파일
- role == 라이브러리 (maybe)
Ansible Playbook을 이용한 managed node 관리를 위한 프로젝트 구조
managed node 관리 목적 코드들을 체계적으로 관리하기 위해 프로젝트 형식으로 디렉토리 조직화
- Ansible 프로젝트 : managed node에 적용할 환경 구성을 위해 필요한 파일 집합
- group_vars : 공통 변수 저장 파일 (YAML 형식) 저장 디렉토리
- hosts : 인벤토리 파일 저장 디렉토리
- playbooks : playbook 파일 저장 디렉토리
- roles : role 파일 저장 디렉토리
Ansible example 참고 사이트
2. 변수와 fact 이해
참고
변수 variable
값을 저장하는 메모리 영역
- Ansible은 프로그래밍 언어 X but 일부 프로그래밍 언어 특징 가짐
=> 가장 중요한 특징 中 1은 변수 대체 (variable substitution)
playbook 변수 정의
vars 섹션에 key (변수 이름)와 value(값) 정의
play에서 사용가능한 변수, key:value 형식으로 정의
- vars
key_file: /etc/nginx/ssl/nginx.key
vars_files 섹션을 이용하여 변수로 구성된 파일 지정 가능
중요 정보가 포함된 변수를 분리하여 관리
- nginx.yml
변수 저장 파일
key_file: /etc/nginx/ssl/nginx.key
- vars_files
playbook의 vars_files 섹션
변수 내용 출력
- debug 모듈 사용
- msg 파라미터 사용하여 변수 내용 출력
- 변수 내용을 사용하고 할 때는 "{{ 변수명 }}" 형식으로 사용
- debug 모듈을 이용하여 변수 출력시 msg="{{ 변수명 }}" 형식으로 사용해야 변수 내용 출력 가능
Task 결과 변수 저장
- task 동작 결과에 따라 변수를 설정할 때는 모듈을 호출시 register 절을 사용하여 변수 생성
- name: create directory
file:
path: "{{ file_path }}"
state: directory
register: result
ignore_errors: true
- register Supported parameters include: _raw_params, _uses_shell, argv, chdir, creates, executable, removes, stdin, stdin_add_newline, strip_empty_ends, warn
- error 발생해도 무시하고 계속 실행하고자 한다면 ignore_errors: true 설정
- 변수를 활용하여 Playbook 동작을 동적으로 수행
ansible-playbook dir_manage.yml -i ./hosts -e "host_names=private file_name=/home/ec2-user/work/temp"
팩트 facts
managed node에 대한 정보
- Ansible Playbook을 실행할 때 첫번째 수행 task가 managed node의 정보를 갖는 팩트를 수집하는 task
- Query : Ansible 팩트를 수집할 때 managed node에 연결해서 managed node에 대한 모든 종류의 세부 정보, 해당 정보는 ansible_facts 변수에 저장됨
gather_facts 속성 : 팩트 수집 유무 결정
gather_facts: True
팩트 수집, default
gather_facts: False
팩트 수집 중단
Ad-hoc 명령으로 팩트 정보 확인
ansible <host 패턴> -m setup
전체 팩트 정보 확인
ansible <host 패턴> -m -a "<filter=하위 facts key> ... "
특정 key 팩트 정보 확인
ansible_fact 변수의 특정 key 접근 방법
"{{ ansible_fact[ 'key 이름' ] }}"
3. TIF
오늘 실습할 때 디렉토리 매니징 부분에서 특정 한 호스트만 집어서 실행했을 때는
ansible-playbook dir_manage.yml -i ./hosts -e "file_name=work2"
무슨 디렉토리를 갑자기 스킵이니 뭐니 해서 아무 반응도 일어나지 않아서 당황스러웠다.
그다음 같은 yaml 파일에서 호스트도 변수화해서 사용자 측에서 입력받는 것으로 바꾸고 나서
ansible-playbook dir_manage.yml -i ./hosts -e "host_names=managed file_name=work3"
이와 같이 명령어를 입력했을 땐 또 정상적으로 잘 작동되더라.
이전 코드와 큰 차이는 없지만 도대체 어떤 원리로 처음껀 스킵하고 나중껀 멀쩡히 되는지 잘 모르겠다.