Ansible 실전 · 컬렉션 - 롤보다 큰 배포 단위 · 실습
사내 컬렉션을 만들어 판을 고정해 배포하기
목표
롤 여러 개를 컬렉션 하나로 묶어 판을 붙이고, 빌드한 묶음을 설치해 FQCN 으로 부르고, 고정 파일로 설치판을 잠그는 한 바퀴를 직접 돌 수 있게 됩니다.
왜 중요한가
롤은 재사용 단위이고 컬렉션은 배포 단위입니다. 팀이 늘어나면 문제는 '이 롤을 어떻게 쓰나' 에서 '지금 저 서버에서 도는 롤이 어느 판인가' 로 옮겨 갑니다. 컬렉션은 그 질문에 답하려고 세 가지를 도입했습니다. 이름에 출처를 적고(FQCN), 묶음에 판을 붙이고(SemVer), 설치할 판을 파일에 적습니다(requirements.yml). 이 세 가지가 없으면 검색 경로의 순서가 무엇이 실행될지를 정하는데, 그 순서는 사람이 아니라 환경이 정합니다. 여기에 롤 인자 명세를 더하면 잘못된 값이 태스크를 돌기 전에 막힙니다 — 남이 쓸 코드를 내보낼 때 문서보다 먼저 갖춰야 할 것입니다. 이 실습은 그 한 바퀴를 인터넷 없이 로컬 묶음만으로 돕니다.
단계
1. ansible-galaxy collection init 으로 acme.platform 컬렉션의 뼈대를 /root/ans/coll/src 아래에 만드세요. 그리고 /root/ans/inventory/hosts.ini 에 web1·web2·db1 을 적은 인벤토리를 만드세요(ansible_host=127.0.0.1, ansible_port=2222, ansible_user=root).
2. /root/ans/coll/src/acme/platform/galaxy.yml 의 version 을 1.2.0 으로, description·authors·repository 를 사내 값으로 채우고 license 에 MIT, tags 에 infrastructure 와 linux 를 넣으세요. 그리고 같은 컬렉션의 meta/runtime.yml 에 requires_ansible 를 범위 표기로 적으세요.
3. 컬렉션 안 roles/motd/ 에 롤을 만드세요. defaults/main.yml 에 motd_banner(기본 acme-platform)·motd_owner(기본 platform)·motd_path(기본 /root/ans/coll/out/motd.txt)를 두고, tasks/main.yml 은 motd_path 에 banner=<motd_banner> 와 owner=<motd_owner> 두 줄을 쓰는 이름 붙은 태스크 하나로 채우세요. 모듈은 FQCN 으로 부릅니다.
4. roles/motd/meta/argument_specs.yml 을 만들어 main 진입점에 short_description 과 세 인자를 적으세요. 셋 다 type: str 이고 description 이 있어야 하며, motd_owner 에는 choices 로 platform 과 sre 두 값만 허용하세요.
5. 컬렉션을 빌드해 /root/ans/coll/dist/acme-platform-1.2.0.tar.gz 를 만들고, 묶음 안에 MANIFEST.json·FILES.json 과 롤 파일들이 들어 있는지 확인하세요.
6. 만든 묶음을 /root/ans/coll/collections 에 설치하고, 그 경로에서 acme.platform 이 1.2.0 으로 보이는지, ansible-doc 으로 acme.platform.motd 롤의 인자가 조회되는지 확인하세요.
7. /root/ans/coll/use.yml 을 만들어 acme.platform.motd 롤을 FQCN 으로 부르되 motd_banner 를 acme-platform in production 으로, motd_owner 를 sre 로 넘기세요. 인벤토리의 web1 을 대상으로 실행해 /root/ans/coll/out/motd.txt 를 남기세요.
8. 소스의 galaxy.yml 판을 1.3.0 으로 올려 다시 빌드하고(묶음이 둘이 됩니다), /root/ans/coll/requirements.yml 에 1.2.0 묶음을 type: file 로 고정해 그 파일로 설치하세요. 그리고 설치된 판을 /root/ans/coll/out/pinned.txt 에 한 줄로 남기세요.
참고
- 이 파드에는 인터넷이 없습니다. Galaxy 에서 내려받는 것과 galaxy.yml 의 dependencies 자동 해결은 이 환경에서 재현할 수 없어 실습에서 뺐습니다. init·build·로컬 묶음 install 은 모두 정상 동작합니다.
- 배포판 컬렉션이 이미 수백 개 깔려 있습니다. 목록을 볼 때는
ansible-galaxy collection list acme.platform -p <경로>처럼 이름과 경로를 함께 주세요. -p로 설치하면 'pip 가 관리하는 자리일 수 있다' 는 경고가 나옵니다. 설치는 정상입니다.- 흔한 실수: 설치는 해 놓고 실행할 때 검색 경로를 주지 않는 것. 설치한 자리와 실행할 때 보는 자리가 같아야 합니다.
- 흔한 실수: galaxy.yml 의 version 을 두 자리로 적는 것. 빌드가 그 자리에서 거절합니다.
- [Collections Guide](https://docs.ansible.com/ansible/latest/collections_guide/index.html) · [Collection structure](https://docs.ansible.com/ansible/latest/dev_guide/developing_collections_structure.html) · [Distributing collections](https://docs.ansible.com/ansible/latest/dev_guide/developing_collections_distributing.html) · [Installing collections](https://docs.ansible.com/ansible/latest/collections_guide/collections_installing.html)
단계 8개
- 컬렉션 뼈대 만들기
- galaxy.yml 채우고 최소 ansible 판 못 박기
- 컬렉션 안에 롤 넣기
- 인자 명세로 잘못된 값 막기
- 묶음으로 빌드하고 내용물 확인하기
- 로컬 경로에 설치하고 문서로 확인하기
- FQCN 으로 불러 실행하기
- 소스는 앞서 나가도 설치판은 고정하기