Docker에서 Ansible Playbook 테스트 하기

1. TL;DR (요약하자면…)

작성한 Ansible Playbook을 테스트 하는데 Vagrant를 사용하고 있었습니다. 훌륭하지만 Debugging을 하기에는 너무나도 불편했습니다. Playbook을 변경하고 나서 몇 개의 명령어를 사용해야 테스트를 할 수 있었죠.

Docker Container를 사용하여 좀 더 쉽고 빠르게 Ansible Playbook을 테스트 하는 방법을 찾아보았습니다.

Container를 생성하는 명령어
docker run --rm -dt --cap-add=SYS_ADMIN -e "container=docker" -e "PLAYBOOK=<PLAYBOOK_NAME>" --workdir="/tmp" -v /sys/fs/cgroup:/sys/fs/cgroup -v "$(pwd)":/tmp williamyeh/ansible:centos7-onbuild /usr/sbin/init

한 번 생성해 놓고 나면 아래 명령어로 Ansible Playbook을 몇번이고 실행할 수 있습니다.
docker container exec -it <CONTAINER-ID> ansible-playbook-wrapper

2. Vagrant의 문제점

Ansible Playbook을 테스트를 Vagrant에서 주로 해오고 있었습니다. 훌륭하지만 몇 가지 아쉬운점이 있었죠.

  • VM 생성시간이 깁니다.
  • 수정된 Playbook을 VM으로 불러들이는 방식이 귀찮습니다.
  • Vagrantfile에서 Ansible을 위한 환경설정이 어렵더라구요
  • 특히, Inventory 목록과 Playbook을 연동하는것이 Vagrant 환경에서는 잘 안되더라구요.

3. Docker Container에서 Playbook 테스트 하기

Docker를 접하고 나서 Ansible Playbook의 Debugging을 Container에서 하고 싶은 욕구가 생겨났습니다. 생각보다 쉽지 않더군요. 게다가 저는 Elasticsearch를 물리서버에 깔기위한 Playbook을 작성하고 있었는데 systemd 모듈을 테스트 할수도 없더라구요.

저는 최대한 물리 서버와 비슷한 환경의 Container가 필요했습니다.

4. 해답

구글을 몇 시간 뒤지고 여러 시행착오 끝에 만족할만한 수준의 답을 발견하였습니다!
- William Yeh님의 Ansible용 Linux Docker Image를 사용합니다.
- 저는 Docker For Mac을 사용하는지라, William Yeh 님께서 하란대로 하면 안되고, 조금 다르게 docker container run을 해야합니다.

5. 사용설명

두개의 단계를 거칩니다.

  1. systemd가 설치되어있는 William Yeh 님의 Image를 사용하여 Container를 생성합니다.
  2. 생성된 Container 에서 ansible-playbook-wrapper 라는 명령어를 실행합니다.

5.1 컨테이너 생성 명령어

docker run --rm -dt --cap-add=SYS_ADMIN -e "container=docker" -e "PLAYBOOK=elasticsearch.yml" --workdir="/tmp" -v /sys/fs/cgroup:/sys/fs/cgroup -v "$(pwd)":/tmp williamyeh/ansible:centos7-onbuild /usr/sbin/init

먼저 명령어를 설명 하자면,

  • 옵션값은 --rm, --dt 입니다.
  • ENVIRONMENT 값으로 PLAYBOOK이 있습니다. 저는 elasticsearch.yml 라는 이름을 가진 Playbook을 실행하고자 하기 때문에 PLAYBOOK=elasticsearch.yml 입니다.
  • 현재 디렉토리를 컨테이너의 /tmp로 마운트 합니다.
  • WORKDIR는 /tmp로 합니다.
  • /sys/fs/croup을 마운트 하는 이유는 systemd의 동작을 위해서 입니다.
  • image는 williamyeh/ansible:centos7-onbuild 입니다. 다른 Linux distro도 있습니다. (아래 참고문헌에서 William Yeh님의 Docker Hub 링크를 참고하세요)

ENVIRONMENT 값으로는

  • PLAYBOOK= Playbook의 파일 이름 입니다. (default = playbook.yml)
  • INVENTORY= Inventory의 파일 이름 입니다. (default = /etc/ansible/hosts)
  • REQUIREMENTS= Role을 명시하는 requirement 파일의 이름입니다. (default = requirements.yml)

5.2 Playbook 실행 명령어

ansible-playbook-wrapper는 William Yeh 님이 만들어 놓은 명령어 입니다. Docker의 ENVIRONMENT 값을 사용하여 이 명령어 한 줄로 Ansible Playbook을 실행할 수 있습니다.

docker container exec -it <CONTAINER_ID> ansible-playbook-wrapper

5.3 Playbook을 수정 한 후 다시 테스트

간단합니다. 우리는 Docker의 bind mounts를 사용하기 때문에 여러분이 playbook을 수정하면 container 내에도 자동으로 반영이 됩니다.

그냥 명령어를 다시 실행하면 됩니다.
docker container exec -it <CONTAINER_ID> ansible-playbook-wrapper

6. 참고문헌

Daewon Kim

Daewon Kim

Perpetual Learner of OpenStack on Kubernetes.