본문 바로가기
교육

[40일 차] 21.09.14 : Ansible 4(Handler, Templates, vars, Roles)

by ballena 2021. 9. 14.

1교시

 

 

6장 후반부 - 네트워크 서버 부분은 넘어가지만, 432 페이지의 문자열 인덱싱/슬라이싱은 자동화에 있어서 필요한 부분이니 알아두고 넘어갈 것.

 

ansible.cfg가 있는 경로 ansible 기준으로 root다.

 

자주 작업할 내용에 대해 동적으로 정보를 수집하는 플레이북을 여러 개 만들어 놓으면, 매 작업마다 새로 만들 필요가 없다. 작업 시에 필요한 기능을 가진 플레이북을 불러오면 되는 것이다.

-> 재사용이 가능한 플레이북

 

 

  • Handler : 작업을 도와주는 역할

1. 전 단계가 정상적으로 이루어졌을 경우에 동작

2. 변경 사항이 발생한 경우에만 동작

-> 더 효과적으로 동작하는 코드

 

교재의 코드(438 페이지)를 보면 handler를 추가했다.

-> 핸들러가 들어간 파일을 2번 실행해 보면, 2번째 실행에서는 RUNNING HANDLER가 동작하지 않는 것을 볼 수 있다.

-> 웹 페이지 받아오는 것 때문에 2번째 실행에서도 changed는 있다.


2교시

 

 

  • 변수(var)

어떤 값을 바로 불러다 쓸 수는 없다. 값을 호출 시 변수에 넣고, 변수를 호출해서 사용해야 한다.

노드 쪽에서 받은 facts를 바로 사용하지 않고, 특정 변수에 넣어서 다음에 사용한다.

 

하나의 파일에서 같은 변수를 여러 번 선언할 때, 우선순위가 필요하다.

교재의 표(450 페이지)에는 나와있지 않지만, 가장 우선순위가 높은 것은 anp 명령어에서 -e 옵션으로 선언하는 변수다.

anp aaa.yml -e lnx_name=CentOS

-> 이렇게 실행해 버리면, aaa.yml 내에서 lnx_name을 선언하더라도 CentOS로 고정된다.

 

동일한 변수일지라도, 우선순위가 가장 높은 곳에 있는 변수를 삽입한다.

-> nginx 설치 실습에서, lnx_name을 지정하는 과정을

1. group_vars 디렉터리에 nodes라는 파일에 저장한다

2. 설치 진행

3. 모든 노드에 실행된다

----

1. nginx와 group_vars를 삭제한다

2. host_vars 디렉터리에 노드 2개의 주소를 이름으로 가진 파일을 만들고, lnx_name을 지정하는 과정을 저장한다.

3. 설치 진행

4. 해당 노드에만 실행된다.

 

/etc/ansible_hosts에 nodes라는 이름으로 주소들을 지정해 놓았는데, group_vars에 nodes라는 파일명으로 설정한 것과

host_vars에 특정 주소를 파일명으로 설정한 것인데, 당연히 후자가 우선순위가 더 높아야 한다.

-> group_vars와 host_vars가 모두 있을 경우 후자만 설치되어야 한다는 것.

-> 그런데 실습 중에는 모두 설치되었다. 

   -> 둘 다 적용되는 것인지, group_vars가 먼저 적용되는 것인지 모르겠다.

-> 물론 실행하는 플레이북 내에 vars로 선언하면 이게 가장 먼저 적용된다(play vars)


3~4교시

 

 

  • Template

-> 일정한 형식을 가지고, 해당 형식에 맞게 동적으로 노드들에게 배포

 

실습에서의 j2는 진자2(jinja2) 확장자.

-> 웹 템플릿

-> 이 파일에 있는 idx와 nu 변수는 yml 파일에서 정의해 주었다.

nginx_install_w_template.yml

매직 변수를 사용했다.

groups 값 중 nodes라는 그룹 사용

group.nodes의 개수(count)를 nu에 저장하고

group.nodes의 특정 노드에서 해당 노드의 inventory_hostname을 뽑아내고, 그 주소의 인덱스를 index()로 알아낸다.

그리고 그 인덱스 값에 +1을 해서 정수형으로 idx 변수에 저장한다.

 

  • 템플릿의 응용

-> yml을 vim으로 작성 시, 색깔이 무조건적으로 구분되는 것은 아니더라.


5~6교시

 

 

4교시 내용 설명 + 강사님 회의 참석 문제로 자습

 

플레이북을 재사용 가능하도록 구성한다는 것은 무엇인가?

=-> 약속된(지정된) 구조/형태로 만들어 사용한다는 것이다.

 

우리는 /home/vagrant/ 에서 작업을 하고 있다.

여기에 CentOS.yml이나 플레이북 등을 만들어 사용하고 있는데, 이러면 구조적으로 좋지 않다. 작업량이 많아지면 너저분해질 것이다.

-> 약속된 구조 : Role을 구성한다.

 

1. defaults

-> 우선순위가 가장 낮은 변수인 디폴트 변수를 가진다. 

 

2. files

-> 노드에 배포할 파일들이 위치한 디렉터리. 주로 노드마다 동적으로 변경할 필요가 없는 파일을 전달할 때 사용된다.

(웹 페이지, 환경 설정 파일 등)

 

3. handlers

-> 핸들러를 선언하는 곳

 

4. meta

-> 의존성이 있는 다른 롤을 선언할 때 사용 + @

 

5. tasks

-> 필수 항목. 플레이북에서 계속 사용되어 왔던 태스크들을 작성하는 곳.

 

6. templates

-> 템플릿(진자2) 파일이 위치하는 곳

 

7. vars

-> 변수들에 대한 정보를 모아두는 곳(우선순위 15)

 

  • nginx with roles

Roles를 이용해 구축한 nginx

(tree 패키지를 설치해 보기 편하게)

교재에서 제시된 파일들을 모두 작성하고, https://gist.github.com/sysnet4admin/에서 기본 설정 파일을 받아온다.

anp로 실행하고 접속해보면 접속이 안될 것이다.

-> 위에서 받아온 nginx 기본 설정 파일(nginx.conf)에서 접속 포트를 8080으로 지정했기 때문.

-> 8080으로 접속하면 접속 성공.

 

files와 templates 외에는 main.yml의 형식 필수.

 

 

벌써 교재 7장인데, 교재가 끝난 후 다시 스스로 훑어보라는 의도라고 한다. 어느 정도 배우다 보니 교재로 독학, 예습, 복습이 가능할 것 같다는 게 느껴진다. 이번 주 안으로 교재를 끝내고, 추석 연휴 동안 세부적으로 복습하라고 권하셨다.

 

 

위에서는 Roles를 위한 디렉터리를 mkdir로 하나하나 만들었다. 당연히 이것도 자동으로 생성해 주는 명령어가 있다.

-> ansible-galaxy init [생성할 Role의 이름]

 

ansible-galaxy init apache

-> apache라는 디렉터리 하에 기본 Roles 구조가 만들어진다.

-> main.yml 파일도 만들어진다(껍데기만).

 


7교시

 

 

적합한 롤을 검색하는 방법

1. 명령어로 검색

ansible-galaxy search --galaxy-tags [이름]

-> 당연히 앤서블이 설치되어 있어야 하고, 가독성도 좋지 않다.

 

2. 앤서블 갤럭시 홈페이지(https://galaxy.ansible.com)d에서 검색

 

 

ansible-galaxy install [-roles-path (설치 경로)] [Role 이름]

-> 설치 경로를 지정하지 않을 경우 ~/.ansible/roles/ 에 설치된다.

ansible-galaxy list

ansible-galaxy remove [Role 이름]

 

아무튼 Role 설치 후, 이 롤을 실행시킬 플레이북을 만들어야 한다(p. 498). 


8교시

 

 

오늘 배운 내용 복습

내일은 호스트 PC에 앤서블을 설치해서 AWS에 인스턴스를 만들어 볼 것이다.

-> 호스트 PC가 ansible-server가 되는 것이다.


다시 들을 만한 부분은 없었지만, 오늘 수업은 한번 훑을 수 있다면 하는 것이 좋을 듯.

댓글