Ansible 실전 · 롤과 재사용 · 실습
재사용 가능한 롤 만들기
목표
플레이북 조각을 롤로 접어 재사용 가능한 단위로 만들고, 같은 롤을 서로 다른 값으로 여러 번 호출할 수 있게 됩니다.
왜 중요한가
롤의 본질은 "코드를 나누는 것"이 아니라 "규약을 정해 두어 설정 없이 재사용되게 하는 것" 입니다. templates/ 에 둔 파일은 경로를 적지 않아도 찾히고, handlers/main.yml 의 핸들러는 등록 과정 없이 쓸 수 있습니다. 이 규약 덕분에 남이 만든 롤도 구조를 짐작할 수 있습니다. 재사용성을 실제로 결정하는 것은 defaults 와 vars 의 선택입니다 — 사용자가 바꿀 값을 vars 에 두면 우선순위가 높아 밖에서 덮어쓸 수 없고, 그 롤은 결국 복사·수정되어 다시 분기합니다. 그리고 변수 이름에 롤 이름을 접두어로 붙이는 습관은 롤이 두 개를 넘어가는 순간 값어치를 합니다.
단계
1. /root/ans/roles/roles/webapp 아래에 tasks, defaults, handlers, templates, meta 디렉터리와 tasks/main.yml 을 만드세요.
2. /root/ans/roles/roles/webapp/defaults/main.yml 에 webapp_port: 8080 과 webapp_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.yml 에 restart 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.yml 의 dependencies 에 선언하세요.
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/inventory/hosts.ini가 없으면 첫 실습에서 만든 것과 같은 인벤토리(web1·web2·db1,ansible_host=127.0.0.1,ansible_port=2222,ansible_user=root,[prod:children]에 web·db)를 먼저 다시 만드세요. 구조는/opt/lab/fixtures/ansible/inventory.sample.ini를 참고하면 됩니다. ansible-galaxy role init roles/webapp로 표준 구조를 한 번에 만들 수 있습니다.- 롤을 호출할 때
- role: webapp아래에 변수를 적으면 그 호출에만 적용됩니다. - 흔한 실수 1: 템플릿에서
templates/를 포함한 경로를 적는 것. 롤 안에서는 파일 이름만 적습니다. - 흔한 실수 2: 7번을 위해 롤을 통째로 복사하는 것. 같은 소스를 두 번 호출하는 것이 요점입니다.
단계 8개
- 롤 뼈대 디렉터리 만들기
- 기본값 두 개 정의하기
- 롤 태스크 작성하고 실행하기
- 롤 템플릿으로 설정 파일 만들기
- 롤 핸들러 정의하고 발화시키기
- 의존 롤 걸어 먼저 실행되게 하기
- 같은 롤을 다른 값으로 두 번 호출하기
- 재실행 멱등성과 린트 통과하기