LabHub
배우기 러닝패스 코스

Ansible in Practice

Building a Reusable Role

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

플레이북 조각을 롤로 접어 재사용 가능한 단위로 만들고, 같은 롤을 서로 다른 값으로 여러 번 호출할 수 있게 됩니다.

왜 중요한가

롤의 본질은 "코드를 나누는 것"이 아니라 "규약을 정해 두어 설정 없이 재사용되게 하는 것" 입니다. templates/ 에 둔 파일은 경로를 적지 않아도 찾히고, handlers/main.yml 의 핸들러는 등록 과정 없이 쓸 수 있습니다. 이 규약 덕분에 남이 만든 롤도 구조를 짐작할 수 있습니다. 재사용성을 실제로 결정하는 것은 defaultsvars 의 선택입니다 — 사용자가 바꿀 값을 vars 에 두면 우선순위가 높아 밖에서 덮어쓸 수 없고, 그 롤은 결국 복사·수정되어 다시 분기합니다. 그리고 변수 이름에 롤 이름을 접두어로 붙이는 습관은 롤이 두 개를 넘어가는 순간 값어치를 합니다.

단계

  1. /root/ans/roles/roles/webapp 아래에 tasks, defaults, handlers, templates, meta 디렉터리와 tasks/main.yml 을 만드세요.
  2. /root/ans/roles/roles/webapp/defaults/main.ymlwebapp_port: 8080webapp_root: /root/ans/roles/artifacts 를 정의하세요.
  3. /root/ans/roles/roles/webapp/tasks/main.yml 에 이름이 붙은 태스크를 2개 이상 넣고, 실행하면 /root/ans/roles/artifacts 디렉터리가 생기게 하세요.
  4. /root/ans/roles/roles/webapp/templates/webapp.conf.j2 를 만들어 /root/ans/roles/artifacts/webapp.conf 로 렌더링하세요. 결과에 port = 8080 줄이 있어야 하고, 템플릿은 webapp_port 변수를 참조해야 합니다.
  5. /root/ans/roles/roles/webapp/handlers/main.ymlrestart webapp 핸들러를 정의하고 /root/ans/roles/roles/webapp/tasks/main.yml 의 태스크에서 notify 하세요. 핸들러는 /root/ans/roles/artifacts/restart.marker 를 만듭니다.
  6. /root/ans/roles/roles/baseline 롤(진입점 /root/ans/roles/roles/baseline/tasks/main.yml)을 만들어 /root/ans/roles/artifacts/baseline.stamp 를 남기게 하고, /root/ans/roles/roles/webapp/meta/main.ymldependencies 에 선언하세요.
  7. /root/ans/roles/site.yml 에서 webapp 롤을 두 번 호출하세요. 한 번은 기본값으로(webapp.conf, port 8080), 한 번은 webapp_port: 9443 으로 /root/ans/roles/artifacts/staging.conf 를 만들게. 롤 디렉터리를 복사하면 안 됩니다.
  8. 플레이북을 두 번째로 실행한 출력을 /root/ans/roles/out/run2.txt 로, ansible-lint 결과를 /root/ans/roles/out/lint.txt 로 저장하세요. 두 번째 실행은 changed=0 이고 핸들러가 돌지 않아야 합니다.

참고

롤 뼈대 디렉터리 만들기

/root/ans/roles/roles/webapp 아래에 tasks, defaults, handlers, templates, meta 디렉터리와 tasks/main.yml 을 만드세요.

ansible-galaxy role init 이 표준 구조를 만들어 줍니다. 필요한 디렉터리는 tasks/defaults/handlers/templates/meta 입니다.

기본값 두 개 정의하기

/root/ans/roles/roles/webapp/defaults/main.ymlwebapp_port: 8080webapp_root: /root/ans/roles/artifacts 를 정의하세요.

덮어쓰기를 기대하는 값은 defaults 에 둡니다. 이름에 롤 이름 접두어를 붙이세요.

롤 태스크 작성하고 실행하기

/root/ans/roles/roles/webapp/tasks/main.yml 에 이름이 붙은 태스크를 2개 이상 넣고, 실행하면 /root/ans/roles/artifacts 디렉터리가 생기게 하세요.

tasks/main.yml 이 진입점입니다. 태스크 2개 이상, 모두 이름이 있어야 합니다.

롤 템플릿으로 설정 파일 만들기

/root/ans/roles/roles/webapp/templates/webapp.conf.j2 를 만들어 /root/ans/roles/artifacts/webapp.conf 로 렌더링하세요. 결과에 port = 8080 줄이 있어야 하고, 템플릿은 webapp_port 변수를 참조해야 합니다.

templates/ 안의 파일은 이름만 적으면 찾습니다. 포트 값은 하드코딩하지 말고 변수를 쓰세요.

롤 핸들러 정의하고 발화시키기

/root/ans/roles/roles/webapp/handlers/main.ymlrestart webapp 핸들러를 정의하고 /root/ans/roles/roles/webapp/tasks/main.yml 의 태스크에서 notify 하세요. 핸들러는 /root/ans/roles/artifacts/restart.marker 를 만듭니다.

handlers/main.yml 의 핸들러는 자동 등록됩니다. 실행되면 마커 파일을 남기세요.

의존 롤 걸어 먼저 실행되게 하기

/root/ans/roles/roles/baseline 롤(진입점 /root/ans/roles/roles/baseline/tasks/main.yml)을 만들어 /root/ans/roles/artifacts/baseline.stamp 를 남기게 하고, /root/ans/roles/roles/webapp/meta/main.ymldependencies 에 선언하세요.

baseline 롤을 따로 만들고 meta/main.yml 의 dependencies 에 적습니다. 의존 롤이 먼저 돕니다.

같은 롤을 다른 값으로 두 번 호출하기

/root/ans/roles/site.yml 에서 webapp 롤을 두 번 호출하세요. 한 번은 기본값으로(webapp.conf, port 8080), 한 번은 webapp_port: 9443 으로 /root/ans/roles/artifacts/staging.conf 를 만들게. 롤 디렉터리를 복사하면 안 됩니다.

플레이의 roles 섹션에서 롤 이름과 함께 변수를 넘길 수 있습니다. 롤을 복사하면 안 됩니다.

재실행 멱등성과 린트 통과하기

플레이북을 두 번째로 실행한 출력을 /root/ans/roles/out/run2.txt 로, ansible-lint 결과를 /root/ans/roles/out/lint.txt 로 저장하세요. 두 번째 실행은 changed=0 이고 핸들러가 돌지 않아야 합니다.

두 번째 실행에서 changed=0 이고 핸들러도 조용해야 합니다. ansible-lint 결과도 남기세요.