공부하기싫어
article thumbnail

 

참고 : 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

 

GitHub - ansible/ansible-examples: A few starter examples of ansible playbooks, to show features and how they work together. Se

A few starter examples of ansible playbooks, to show features and how they work together. See http://galaxy.ansible.com for example roles from the Ansible community for deploying many popular appl...

github.com

 

 

 

 

 

  • 변수와 fact 이해

참고

https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#registering-variables

 

Using Variables — Ansible Documentation

You should choose where to define a variable based on the kind of control you might want over values. Set variables in inventory that deal with geography or behavior. Since groups are frequently the entity that maps roles onto hosts, you can often set vari

docs.ansible.com

 

  • 변수 - 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

playbook code

task 안에 - name /n module 순서로 넣으면 차례대로 실행하는것 같다

 

result

이번엔 퍼블릭2번 인스턴스를 종료하고 ping 테스트를 해봤다

result2

gathering facts , ping test 에서는 unreachable 이 1이 리턴됬고 pwd 결과는 그냥 출력이 안되는 모습

 

  • playbook - mkdir, cd, copy, rmdir

playbook code

디렉토리 생성이 state: directory 인가? 대충 느낌이고

register 는 결과를 저장하는 부분인것 같다

 

run

create directory task 에서 2개 changed 됬다고 나오고 debug 에 결과가 true 로 되어있다

ad-hoc 명령

ad-hoc 명령으로 ls 확인

 

이번에는 public2 를 실행해서

타깃부분이 2개인 playbook을 만들어보자

ls 도 계속 print 되도록 해볼 생각

 

code

위에서부터 순서대로 내려올거임

 

play-mkdir on pub2 / task - input ls, show ls, create dir

input ls 명령을 프롬프트에 보여주는 show ls 로 stdout_lines 에서 현재 디렉토리 목록을 볼 수 있었다.

그리고 mkdir 로 public2 에만 디렉토리를 생성해줌

 

play - cd / task - cd, input ls, show ls

이번 플레이 호스트는 managed 그룹으로 해서

cd 해주고

ls 해줘서

task - show ls 에서 결과값을 출력하는데 역시 stdout_lines 부분에서 현재 디렉토리에 pb-mkdir 파일이 추가된걸 볼 수 있었다.

 

public2 결과

public2 에서도 추가됬는데

왜 cd 했는데 ls 하니까 ec2-user 디렉토리 결과가 나오나 하고 보니

path 뒤에 / 이걸 안붙여줘서 그런거 같다

 

이제 새로 만든 pb-mkdir 디렉토리로 controler 에 있는 파일을 카피해보자

컨트롤러에 playbooktext.txt 파일을 만들고

managed node 로 카피해볼꺼다

code
result1
result2

 

ls -lF 로 copy 된걸 확인한 모습

 

 

  • playbook - webserver - install, running, remove

yum 모듈 예제 코드

https://sh-safer.tistory.com/58

 

[Ansible] yum module 예제 정리

예제 1. httpd 최신 버전의 패키지 설치 - name: install the latest version of Apache yum: name: httpd state: latest 예제 2. 여러 패키지를 한 번에 설치 - name: Install a list of packages yum: name: - n..

sh-safer.tistory.com

create public group
playbook - install and running
playbook result1
playbook result2

public1은 이미 httpd가 설치되어있었나봄

 

access

두 아이피 모두 httpd 아파치 서버가 설치된 모습

삭제나 중지는 state 값만 바꾸면 되는데

 

absent
removed  httpd

삭제 됨

 

  • playbook - print variable

variable

위에 vars: 에 선언해주고

key: value 가 되는거고

result

{{ 변수명 }} 로 호출

 

  • playbook - using variable

코드
result
result

변수에 .stdout 으로 간단하게 획인할 수도 있는것 같다

 

stdout

 

stdout_lines

 

원래 레지스터 디버그 하면 ㅈㄴ길게 나왔는데

이렇게 보니까 편하네

 

 

 

  • 팩트 - 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 이름']}}"