참고 : https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#registering-variables
- Playbook 이해
Playbook 구조
playbook-play-task 구조
playbook - play의 집합
play
- managed node에 적용할 여러 작업 코드 집합
- 한 번에 일괄적으로 수행할 작업 단위 - task 모음
task - 실제 수행할 작업 내용 - 모듈로 표현
Playbook의 play 코드 구조
- '---' - Playbook 문서 시작
- 타깃 부분
play에 대한 공통 정보, 필수 사항
실행장비, 사용자 정보 등
- name
play가 어떤 목적을 가지는지 설명
playbook 실행시 출력되는 내용
생략가능
- hosts
play가 적용될 managed node에 대한 이름 (host이름)
인벤토리에 정의된 이름 사용
- user
play를 적용할 사용자 id
- 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 목록, 필수 사항
실제 수행할 모듈
- name
하나의 테스크 설명
name attribute의 내용을 기술하지 않아도 되지만 실무에서는 항상 기술한다고 함
managed node 에서 수행한 모듈 명시
- Playbook - play - role 구조
role
- 불필요하거나 중복되는 소스를 제거하고 자주 사용하는 기능을 재사용하기 위해 사용하는 task 코드 집합
- 라이브러리
통상 프로그래밍 언어에서 함수(function)를 모아놓은 파일을 의미
role 을 라이브러리라고 생각할 수 있다.
- YAML 형식으로 작성함
- Ansible Playbook 을 이용한 managed node 관리를 위한 프로젝트 구조
managed node를 관리하기 위한 코드들을 체계적으로 관리하기 위해 프로젝트 형식으로 디렉토리 조직화
- Ansible 프로젝트 : managed node 에 적용할 환경 구성을 위해 필요한 파일 집합
- group_vars : 공통 변수 저장 파일(YAML) 저장 디렉토리
- hosts : 인벤토리 파일 저장 디렉토리
- playbooks : playbook 파일 저장 디렉토리
- roles : role 파일 저장 디렉토리
ansible example 참고 사이트
https://github.com/ansible/ansible-examples
- 변수와 fact 이해
참고
https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#registering-variables
- 변수 - variable
값을 저장하는 메모리 영역
ansible 은 프로그래밍 언어는 아니지만 일부 프로그래밍 언어의 특징을 가짐
가장 중요한 특징 중 하나는 변수 대체(variable substitution)이다.
play 변수 정의
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 섹션 - nginx.yml
- 중요 정보가 포함된 변수를 분리하여 관리
- 변수 내용 출력
debug 모듈 사용
msg 파라미터 사용하여 변수 내용 출력
변수 내용을 사용하고자 할땐 "{{변수명}}" 형식으로 사용
debug 모듈을 이용하여 변수 출력시 msg 파라미터에 "{{변수명}}" 형식으로 사용해야 변수 내용을 출력할 수 있다.
- Task 결과 변수 저장
task 동작 결과에 따라 변수를 설정할 때는 모듈을 호출할 때 register 절을 사용하여 변수 생성
- 모듈과 register는 같은 열에 위치해야 함
name: create directory
file:
path: "{{ file_path }}"
state: directory
register: result
- error 발생하더라도 무시하고 계속 실행하고자 한다면 ignore_errors 절에 true 로 설정하면 됨
--- - name: variable test hosts: managed gather_facts: False vars: message: Ansible variable test tasks: - name: debug module test debug: msg: - name: print variable debug: msg: "message variable -> {{ message }}" - name: task variable test hosts: private gather_facts: False vars: file_path: /home/ec2-user/work tasks: - name: create directory file: path: "{{ file_path }}" state: directory register: result ignore_errors: true - name: change directory shell: cmd: cd "{{ file_path }}" register: foo_result ignore_errors: true - name: print result debug: msg: "foo_result-> {{foo_result}} | result -> {{ result }}" |
- 변수를 활용하여 Playbook 동작을 동적으로 수행
--- - name: create directory & change directory hosts: "{{ host_names }}" gather_facts: False tasks: - name: create directory file: path: "{{ file_name }}" state: directory register: result_create - name: change directory shell: cd "{{ file_name }}" - name: debug debug: var: result_create 실행 방법 - ansible-playbook dir_manage.yml -i ./hosts -e "host_names=private file_name=/home/ec2-user/work/temp" |
- Playbook 실습
vsc 로 controler 에 접속해서 코드를 쳐봤는데 들여쓰기가 자동으로 스페이스 2칸으로 조정되는것 같다
편하네
- playbook - ping test
task 안에 - name /n module 순서로 넣으면 차례대로 실행하는것 같다
이번엔 퍼블릭2번 인스턴스를 종료하고 ping 테스트를 해봤다
gathering facts , ping test 에서는 unreachable 이 1이 리턴됬고 pwd 결과는 그냥 출력이 안되는 모습
- playbook - mkdir, cd, copy, rmdir
디렉토리 생성이 state: directory 인가? 대충 느낌이고
register 는 결과를 저장하는 부분인것 같다
create directory task 에서 2개 changed 됬다고 나오고 debug 에 결과가 true 로 되어있다
ad-hoc 명령으로 ls 확인
이번에는 public2 를 실행해서
타깃부분이 2개인 playbook을 만들어보자
ls 도 계속 print 되도록 해볼 생각
위에서부터 순서대로 내려올거임
input ls 명령을 프롬프트에 보여주는 show ls 로 stdout_lines 에서 현재 디렉토리 목록을 볼 수 있었다.
그리고 mkdir 로 public2 에만 디렉토리를 생성해줌
이번 플레이 호스트는 managed 그룹으로 해서
cd 해주고
ls 해줘서
task - show ls 에서 결과값을 출력하는데 역시 stdout_lines 부분에서 현재 디렉토리에 pb-mkdir 파일이 추가된걸 볼 수 있었다.
public2 에서도 추가됬는데
왜 cd 했는데 ls 하니까 ec2-user 디렉토리 결과가 나오나 하고 보니
path 뒤에 / 이걸 안붙여줘서 그런거 같다
이제 새로 만든 pb-mkdir 디렉토리로 controler 에 있는 파일을 카피해보자
컨트롤러에 playbooktext.txt 파일을 만들고
managed node 로 카피해볼꺼다
ls -lF 로 copy 된걸 확인한 모습
- playbook - webserver - install, running, remove
yum 모듈 예제 코드
https://sh-safer.tistory.com/58
public1은 이미 httpd가 설치되어있었나봄
두 아이피 모두 httpd 아파치 서버가 설치된 모습
삭제나 중지는 state 값만 바꾸면 되는데
삭제 됨
- playbook - print variable
위에 vars: 에 선언해주고
key: value 가 되는거고
{{ 변수명 }} 로 호출
- playbook - using variable
변수에 .stdout 으로 간단하게 획인할 수도 있는것 같다
원래 레지스터 디버그 하면 ㅈㄴ길게 나왔는데
이렇게 보니까 편하네
- 팩트 - facts
managed node 에 대한 정보
Ansible Playbook을 실행할 때 첫 번째 수행 Task 가 managed node 의 정보를 갖는 팩트를 수집하는 Task 이다.
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 setup -a "<filter=하위 facts keys>..." -> 특정 key 팩트 정보 확인
ansible_fact 변수의 특성 key 접근 방법
- "{{ansible_fact['key 이름']}}"
'Kubernetes > [구름] 쿠버네티스 전문가 양성 과정 k-digital' 카테고리의 다른 글
[9주-9.26] Docker 이해 (0) | 2022.09.26 |
---|---|
[8주-9.23] playbook 확장 (0) | 2022.09.23 |
[8주-9.21] Ansible - module, YAML, playbook 개요 (0) | 2022.09.21 |
[8주-9.19~20] IaC, CloudFormation, Ansible (1) | 2022.09.20 |
[5주-20일차] (0) | 2022.08.30 |