Ansible Molecule with Kind - 도커를 활용한 쿠버네티스 자동화 테스트 작성

Ansible Molecule with KIND (Kubernetes IN Docker) Ansible Molecule은 Ansible roles를 가상화 기술을 통해 환경을 고립시켜서 환경 구성을 테스트할 수 있게 도와주는 도구. KIND는 Kubernetes 클러스터를 도커 컨테이너로 동작시켜주는 도구. 쿠버네티스 클러스터 위에서 리소스를 배치하고 리소스를 확인하거나 어플리케이션 동작을 검증하는 용도로 사용함. (ex, Helm Chart) 제약사항 Docker Engine 설치 KIND 설치 Python libraries 설치 pip install molecule[docker,lint] molecule-docker!=0.3.4 openshift molecule-docker 0.3.4 버전은 문제가 있어 사용 금지 Ansible collections 설치 ansible-galaxy collection install community.kubernetes community.docker 테스트 시나리오 작성 및 실행 Ansible role 생성 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 $ ansible-galaxy role init myrole - Role myrole was created successfully $ tree myrole myrole ├── README.md ├── defaults │ └── main.yml ├── files ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── tasks │ └── main.yml ├── templates ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml $ vi myrole/meta/main.yml --- collections: - community.kubernetes $ vi myrole/tasks/main.yml --- - name: Ensure the K8S Namespace exists. k8s: api_version: v1 kind: Namespace name: "myrole-ns" kubeconfig: "{{ kube_config }}" state: present Molecule default 시나리오 초기화 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 $ cd myrole $ molecule init scenario --dependency-name galaxy --driver-name delegated --provisioner-name ansible --verifier-name ansible default INFO Initializing new scenario default... INFO Initialized scenario in /path/to/myrole/molecule/default successfully. $ tree molecule molecule └── default ├── INSTALL.rst ├── converge.yml ├── create.yml ├── destroy.yml ├── molecule.yml └── verify.yml 1 directory, 6 files KIND Config 매니페스트 파일 생성 1 2 3 4 5 6 7 8 9 10 11 12 $ mkdir -p molecule/default/manifests $ vi molecule/default/manifests/kindconfig.yaml --- kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 networking: kubeProxyMode: ipvs nodes: - role: control-plane image: kindest/node:v1.19.7@sha256:a70639454e97a4b733f9d9b67e12c01f6b0297449d5b9cbbef87473458e26dca - role: worker image: kindest/node:v1.19.7@sha256:a70639454e97a4b733f9d9b67e12c01f6b0297449d5b9cbbef87473458e26dca Molecule default 시나리오 설정 수정 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 $ vi molecule/default/molecule.yml --- dependency: name: galaxy driver: name: delegated platforms: - name: instance provisioner: name: ansible inventory: host_vars: localhost: kind_name: myk8s kind_config: manifests/kindconfig.yaml kube_config: /tmp/kind/kubeconfig.yaml verifier: name: ansible Molecule default 시나리오 생성 플레이북 수정 1 2 3 4 5 6 7 8 9 10 11 12 13 14 $ vi molecule/default/create.yml --- - name: Create hosts: localhost connection: local gather_facts: false tasks: - name: Create Kubernetes in Docker command: >- kind create cluster --name {{ kind_name }} --config {{ kind_config }} --kubeconfig {{ kube_config }} changed_when: true Molecule default 시나리오 삭제 플레이북 수정 1 2 3 4 5 6 7 8 9 10 11 12 13 $ vi molecule/default/destory.yml --- - name: Destroy hosts: localhost connection: local gather_facts: false tasks: - name: Delete Kubernetes in Docker command: >- kind delete cluster --name {{ kind_name }} --kubeconfig {{ kube_config }} changed_when: true Molecule default 사나리오 환경 구축 플레이북 수정 1 2 3 4 5 6 7 8 9 10 11 $ vi molecule/default/converge.yml --- - name: Converge hosts: localhost connection: local gather_facts: false collections: - community.kubernetes tasks: - include_role: name: "myrole" Molecule default 시나리오 검증 플레이북 수정 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $ vi molecule/default/verify.yml --- - name: Verify hosts: localhost connection: local gather_facts: false collections: - community.kubernetes tasks: - k8s_info: kind: Namespace name: "myrole-ns" kubeconfig: "{{ kube_config }}" register: k8s_info_result - assert: that: not k8s_info_result.failed fail_msg: "K8S Namespace not exists" success_msg: "K8S Namspace exists" Molecule default 시나리오 테스트 1 2 3 4 5 6 7 8 9 10 # Molecule default 시나리오 테스트 수행 $ molecule test # Molecule default 시나리오 환경 구축 (Optional) ## 쿠버네티스 클러스터와 환경 구축까지만 진행한 상태에서 직접 확인해보고 싶을 때 사용 가능 $ molecule converge # Molecule default 시나리오 환경 제거 (Optional) ## 수동으로 쿠버네티스 클러스터와 환경 구축을 진행한 경우 직접 삭제를 해줘야 함. $ molecule destory 주의사항 KIND는 base/node 이미지로 구성 base 이미지는 ubuntu, systemd, containers 등의 쿠버네티스가 동작할 수 있는 기반 프로그램이 설치되는 이미지 node 이미지는 base 이미지를 기준으로 kubernetes 클러스터 동작을 위한 이미지 Ubuntu 버전 등의 기반 패키지의 버전을 실 환경과 동일하게 맞추려면, base/node 이미지를 KIND 문서를 참고해서 직접 만들어야 함.

2022년 5월 26일 · 4 분 · Sung-Kyu Yoo

Ansible Molecule으로 테스트 작성하기

Molecule ansible-community 에서 관리하는 Ansible role용 테스트 프레임워크. Molecule는 여러 인스턴스, 운영 체제 및 배포, 가상화 공급자, 테스트 프레임 워크 및 테스트 시나리오를 사용한 테스트를 지원. 설치하기 Pip 설치 시, 시스템 파이썬의 의존성을 꼬이게할 수 있으므로 가급적 Virtualenv로 가상 환경을 만들거나 Pipenv, Poetry 등의 의존성 관리 도구 사용하는 것을 권장. 1 2 # docker 및 yamllint, ansible-lint 패키지 추가로 설치. (podman, vagrant, azure, hetzer 도 지원) $ pip install molecule[docker,lint] 테스트 작성 /path/to/role/molecule/default 경로에 디렉토리 생성. (default 는 기본 시나리오. 다른 이름으로 시나리오 추가 가능함) /path/to/role/molecule/default/molecule.yml 파일 생성 후 아래 내용 입력. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 --- dependency: name: galaxy options: requirements-file: ../../requirements.yml driver: name: docker platforms: - name: instance image: docker.io/python:3.6-slim-buster pre_build_image: true provisioner: name: ansible verifier: name: ansible lint: | set -e yamllint -c ../../.yamllint . ansible-lint -c ../../.ansible-lint /path/to/role/molecule/default/converge.yml 생성 후 환경 구성 코드 추가 도커 컨테이너를 만들고 난 이후에 Role 수행으로 환경을 구성하기 위한 코드를 삽입. (웹 서버 배포 등) ...

2022년 5월 26일 · 2 분 · Sung-Kyu Yoo

Ansible Callback Plugin 소개

Ansible Plugin 중에서 Callback Plugin 에 관련한 부분만 정리합니다. Callback Plugin 은 Ansible 에서 특정 이벤트 발생 시 데이터를 로깅한다거나 Slack, Mail 등의 외부 채널로 Write 하는 등의 다양한 목적을 달성하기 위해 사용하는 모듈입니다. 참고로 이 내용은 Ansible 2.2.1.0 기준으로 작성되었습니다. 소개 Ansible Callback Plugin 은 Ansible 의 각종 이벤트를 Hooking 해서 해당 시점에 원하는 로직을 수행할 수 있는 플러그인을 말합니다. 이 콜백 플러그인은 Ansible Task, Playbook 등에 대해 “실행 직전”, “실행 종료” 등의 이벤트에 대한 콜백 함수를 정의할 수 있도록 지원합니다. ...

2017년 11월 14일 · 5 분 · Sung-Kyu Yoo

Ansible Module 개발하기

Ansible 은 대규모의 서버 장비에 대한 설치 및 어플리케이션의 배포와 서비스 운영에 대한 자동화 부분을 비교적 쉽게 작성할 수 있도록 기능을 제공합니다. 최신 트렌드인 DevOps 를 가능케하는 방법 중에 하나라고 할 수 있습니다. Ansible 은 SSH 를 기반으로 수행되며, 원격 장비의 SSH 접근 권한이 필요합니다. 별도의 데몬이나 에이전트는 필요하지 않습니다. 원격 장비 (기본 제공되는 Ansible Module 의 경우) Python-2.6 이상만 시스템에 설치가 되어 있으면 됩니다. (일부 모듈은 별도의 파이썬 모듈을 필요로 하는 경우도 있습니다.) Ansible Module 은 멱등성을 보장하는 것을 권장 합니다. 일부, 모듈에 예외적으로 멱등성을 보장하지 않는 경우 문서에 주의사항을 꼭 남겨놓아야 합니다. 소개 Ansible Module 은 Ansible Playbook 의 하나의 Task 에서 어떠한 목적을 가지는 일련의 기능 집합이라고 생각할 수 있습니다. 예를 들어, “파일을 A 경로에서 B 경로로 파일을 옮기는 기능” 이 필요할 경우, Ansible 에서 기본 모듈로 제공하는 “file” 모듈을 사용하면 됩니다. ...

2017년 11월 14일 · 4 분 · Sung-Kyu Yoo

Ansible Galaxy - Git 저장소를 활용하여 Role 의존성 관리하기!

Git 저장소에 Ansible Role 올리기 먼저, Ansible Role 을 개발하기 위한 Git repository를 생성한다. 그리고, Ansible Role 초기 프로젝트 구조를 Ansible Galaxy 를 사용하여 생성한다. Git repository 를 로컬 머신에 복제한다. 1 $ git clone "https://github.com/xxxxx/sample-role.git" Ansible Role 초기 디렉토리 및 파일 생성한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 $ ansible-galaxy init --force sample-role - sample-role was created successfully $ tree sample-role/ sample-role/ ├── README.md ├── defaults │ └── main.yml ├── files ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── tasks │ └── main.yml ├── templates ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml Ansible Role 개발을 진행 한 뒤에 Git repository 에 Push 1 $ git commit * -m "Add ansible role" && git push Git 저장소로부터 Ansible Role 가져오기 방법 1) Ansible Galaxy CLI 명령을 통해 다운로드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 $ ansible-galaxy install git+https://github.com/xxxx/sample-role.git,master -p roles/ $ tree roles/ roles/ └── sample-role ├── README.md ├── defaults │ └── main.yml ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── tasks │ └── main.yml ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml 방법 2) 의존성 파일에 명시하고 CLI 명령을 통해 다운로드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 $ vi requirements.yml - src: git+https://github.com/xxxx/sample-role.git version: master $ ansible-galaxy install -r requirements.yml -p roles/ - extracting sample-role to roles/sample-role - sample-role was installed successfully $ tree roles/ roles/ └── sample-role ├── README.md ├── defaults │ └── main.yml ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── tasks │ └── main.yml ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml ‘requirements.yml’ 작성하기 src username.role_name : Ansible Galaxy 공식 저장소에 등록된 Ansible Role 을 다운로드할 때 사용. url : Ansible Galaxy 에서 지원하는 SCM으로부터 다운로드할 때 사용. scm 연동할 SCM 이름을 명시. 디폴트 값은 ‘git’ (ansible-galaxy 2.2.1.0 기준으로 git, hg 만 지원) version tag 명 / commit hash 값 / branch 이름을 명시. 디폴트는 ‘master’ SCM 으로부터 가져올 때에만 사용. name 다운로드한 Ansible Role 의 이름을 명시. 기본적으로는 Ansible Galaxy에 등록된 이름 혹은 Git repository 의 이름을 사용. 아래 예시를 참고! ...

2017년 2월 16일 · 3 분 · Sung-Kyu Yoo