Iac를 통해 코드(script)로 환경을 구축할 수 있게 되었다. 대표적인 Iac 도구로써 ansible, terraform, aws cloud formation, chef, puppet 등이 있는데 여기서는 ansible을 사용하겠다.
Agentless : Ansible은 별도로 관리하고자 하는 대상 서버에 추가로 설치할 게 없다. ssh 프로토콜을 이용한다.
ansible을 host pc의 windows에 직접 설치하기에는 어렵다. 따라서 VM or 도커에다가 ansible server를 구동시키는데 여기서는 도커에다가 ansible server를 구동시키겠다. 참고로 연결은 ssh 프로토콜 통신을 사용한다.
ansible client로는 docker-server, ansible-server 두개를 지정하겠다.
ansible docker 이미지 다운
docker pull edowon0623/ansible
컨테이너 실행(DooD 방식으로 기동)
docker run -itd --name ansible-server -p 20022:22 -p 8081:8080 -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /var/run/docker.sock:/var/run/docker.sock edowon0623/ansible:latest /usr/sbin/init
ssh root@localhost -p 20022
password : P@ssw0rd
ansible client 지정
vi /etc/ansible/hosts에서 client의 ip주소 지정
ex) [devops]
172.17.0.3 (ansible-server)
172.17.0.4 (docker-server)
ssh key 생성을 통한 자동 로그인
ansible 서버에서 다른 서버로 접속하려면 port forwarding이 아닌 해당하는 컨테이너의 ip address를 이용한다. 접속을 시도할때 id와 pw를 입력해야 하는데 매번 ansible에서 접속을 시도할때 입력하기 번거롭다. 따라서 ansible에서 키를 하나 만들어서 해당하는 키값을 서버들에게 전달하면 자동 접속이 가능하다.
ssh-keygen
ssh-copy-id root@172.17.04
실행 옵션
ansible은 기본적으로 멱등성 성질을 지닌다.
멱등성 : 같은 설정을 여러번 적용하더라고 결과가 달라지지 않는 성질
ex1) 연결 테스트
ansible all -m ping
핑 테스트 성공했다. 만약 172.17.0.4번 서버를 중지시키면 172.17.0.4는 Fail이 뜬다.
ex2) 메모리 확인
ansible all -m shell -a "free -h"
ansible client들의 메모리 상태를 확인할 수 있다. 참고로 리눅스에서 free -h
라는 명령어는 메모리를 확인시켜준다.
📌 ansible server는 모듈을 이용해서 파일 전송, 프로그램 설치 등 필요한 환경설정, 제어 작업들을 1번의 명령어로 client server들을 제어할 수 있다.
ansible playbook은 사용자가 원하는 작업을 사전에 스크립트 파일 형식으로 작성하여 Ansible을 편리하게 활용할 수 있게 해주는 도구다. playbook은 yaml 형식으로 작성되며, 복잡한 작업을 수행하거나 여러 호스트에 대해 일괄 작업을 수행하는 데 유용하다.
ex1) ansible client 추가
1. playbook 작성
참고로 Ansible은 멱등성 성질을 가지고 있어서 playbook을 여러번 실행시켜도 한번만 적용된다.
ex2) 파일 복사
1. playbook 작성
기존에 github에서 jenkins를 사용하여 코드를 가져와 war 파일로 빌드하고 docker 서버에 ssh를 통해 war 파일을 복사한 다음 실행시켰다. 하지만 기존에 만들어진 컨테이너를 2번 이상 실행했을 때 오류가 발생하는 문제가 있었다.
이를 ansible을 이용해서 해결해보자.
name : ansible-server
hostname : 172.17.0.3
username : root
password : P@ssw0rd
port : 22
playbook 실행 명령어
기존에 있었던 이미지와 컨테이너를 삭제하고 다시 생성하므로 에러가 발생하지 않는다.
host file 만들기
다음과 같은 ansible playbook 실행 명령어에서 hosts 자리에 ansible client의 address를 지정해줄 수 있다.
ansible-playbook -i hosts first-devops-playbook.yml
결과 확인
코드를 수정하고 커밋 푸시하면 자동으로 ansible이 war 파일을 가지고 image와 컨테이너를 만들어 실행시켜준다.
만든 image를 docker hub 사이트에 올릴 수 있다.
docker tag cicd-project-ansible [본인 docker 계정]/cicd-project-ansible
docker push [본인 docker 계정]/cicd-project-ansible