앤서블 인스턴스 생성
- 이름: Ansible-server
- AMI : Amazon Linux2
- t2.micro
- NEW-VPC-PUBLIC-SUBNET-2A
- 보안그룹: dev-SG
- 사용자 데이터
#!/bin/bash
timedatectl set-timezone Asia/Seoul
hostnamectl set-hostname ansible-server
amazon-linux-extras install -y ansible2
amazon-linux-extras install docker -y
systemctl enable --now docker
curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
usermod -a -G docker ec2-user
- poweroff 버튼을 누르면 절전모드로 진입하게 한다.
- 무료라고 한다.
- 참고, 세부 CloudWatch모니터링은 SAA문제에 자주 나오는 문제이다.
- EC2모니터링은 보통 5분 간격으로 모니터링 하게 된다.
- 세부 모니터링은 간격 5분을 1분으로 줄이는 기능이다.
- 그러나 추가 비용이 지출될 것이다.
Route53에서 레코드 생성
- andible 을 Route53에 등록하여 도메인주소를 만들어준다.
SSH설정
- sudo passwd ec2-user
- sudo vi /etc/ssh/sshd_config
- ec2 인스턴스를 키 없이 암호로 접속할 수 있도록 설정한다.
- sudo systemctl restart sshd
ansible 세팅
도커 호스트와 연결
vi /etc/ansibl/hosts
ansible all -m ping
- ansible 에서 SSH 로 도커 호스트에 접속해서 잘 작동이 되는지 확인해주는 명령어
- 퍼미션 에러로 접속할 수 없다.
ansible all -m ping -k
- 이번에는 접속하는데에 -k옵션을 줘서 비밀번호를 입력하여 ping테스트가 성공하였다.
ssh-keygen -t rsa
- ssh-copy-id [privateip]
- key를 도커 호스트에 옮겨준다.
- 그리고 -k옵션 없디
ansible all -m ping
명령어를 입력해본다.
- SUCCESS, 성공적으로 잘 연결되어줬다.
기본 명령어
ansible all -m command -a uptime
- 도커 호스트의 실행시간 표시
ansible all -m command -a "docker ps -a"
- 앤서블의 호스트(도커호스트)에 docker ps -a명령을 주어 실행하였다.
Jenkins와 연결하기위한 세팅
sudo mkdir /opt/docker
sudo chown -R ec2-user:ec2-user /opt/docker
- jenkins에서 수정할 수 있도록 사용권한을 ec2-ucer로 준다.
Jenkin와 연결
- 여기서 추가를 눌러 새로운 SSH Server를 연결해준다.
- 이렇게 추가후 오른쪽 아래 TEST를 눌러 접속 테스트를 해준다.
- Success가 나오면 성공이다.
새 프로젝트 생성
- 이름: Copy_Atifacts_onto_Ansibe
- Copyfrom: BuildAndDeployOnContainer
- Maven Project로 생성해준다.
General
git
- 지금 gitlab을 올리지 않았기 때문에 github의 주소를 넣어준다.
빌드 유발
- 현재 잠깐 테스트를 위해 Poll SCM을 꺼준다.
빌드 후 조치
확인
- git 주소를 잘못 넣어줬던 1번 시도는 실패했고, 2번시도에서 성공했다.
ansible server 에서 docker 시작하기
vi dockerfile
FROM tomcat:9
RUN cp -R /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps
COPY ./*.war /usr/local/tomcat/webapps
docker build -t tomcat_ansible .
- -t옵션으로 tomcat_ansible이라는 이름을 준다.
.
으로 현재 위치의 dockerfile로 빌드한다는 것을 명시
docker run -d -p 8080:8080 --name tomcat-container tomcat_ansible
- 방금 생성한 이미지로 컨테이너를 시작한다.
- 컨테이너를 삭제할 때는 위와같이 삭제해준다.
앤서블 인벤토리 정의
sudo vi /etc/ansible/hosts
[docker-host]
192.168.8.114
[ansible-server]
192.168.10.42
- host들을 정의하는 것이다.
- docker-host, ansible-server라는 이름으로 그룹을 지워줬다.
- 이렇게 정의한 후에는 반드시
ansible all -m ping
명령어로 연결이 되는지 확인해줘야한다.
- 위 도커 호스트는 아까 등록해준만큼, 바로 Success지만,
- 우리 스스로의 ping에 에러가 출력되었다.
ssh-copy-id 192.168.10.42
- 우리 스스로에게 ssh-key를 복사해주고, 다시
ansible all -m ping
을 실행하면 드디어 접속이 된다.
Ansible로 build
- cd /opt/docker
- docker login
vi build.yaml
- hosts: ansible-server
tasks:
- name: create docker image
command: docker build -t jo1132/mytomcat:v1.0 .
args:
chdir: /opt/docker
- name: push docker image
command: docker push jo1132/mtomcat:v1.0
- 잘 빌드되었다.
- 도커 허브에서 jo1132/tomcat이 잘 push되었다.
Jenkins 프로젝트 구성 수정
- 이제 빌드 유발을 새로 만들어준다.
- 또 빌드 후 수정에서 내용을 추가해준다.
cd /opt/docker
ansible-playbook build.yaml
- 위 설정으로, Jenkins에서 계속 리스닝하여, ansible-playbook을 실행하고, ansible에서 dockerhub에 push할 것이다.
- 확인하기 위해 도커허브의 mytomcat 레포지토리를 지워본다.
- 생성되었다.
ansible에서 docker container 띄우기
vi deploy.yaml
- hosts: docker-host
tasks:
- name: remove container
command: docker rm -f docker-container
- name: remove image
command: docker rmi -f jo1132/mytomcat:v1.0
- name: create container
command: docker run -d -p 8080:8080 --name docker-container jo1132/mytomcat:v1.0
- 현재 도커에서 실행하는 컨테이너와, 이미지를 모두 삭제한다.
- 그 후, 다시 도커 컨테이너를 실행한다.
- 도커 내부에서 image를 삭제했으니, dockerhub에서 이미지를 가져올 것이다.
Jenkins수정
cd /opt/docker;
ansible-playbook build.yml;
sleep 10;
ansible-playbook deploy.yml
- Execcomand에 위 내용을 추가해준다.
- 빌드가 성공했다.
- 빌드가 성공하고 성공적으로 커밋되었다.