도커 관련된 모듈이 있지만은 커맨드로 해야한다.
#jenkins + ansible 멱등성을 위해
vm은 jenkins 1대 ansible1대 docker1대 준비
Vagrantfile ansible 추가
config.vm.define "ansible" do |ubuntu|
ubuntu.vm.box = "ubuntu/focal64"
ubuntu.vm.hostname = "ansible"
ubuntu.vm.network "private_network", ip: "192.168.59.13"
ubuntu.vm.provider "virtualbox" do |vb|
vb.name = "ansible"
vb.cpus = 2
vb.memory = 2000
end
end
ansible vm 에는 ansible과 docker가 같이 있어야함
vagrant ssh ansible
sudo apt update
sudo apt install ansible
docker 설치 링크: https://docs.docker.com/engine/install/ubuntu/
set up the repository 순서대로
install Docker Engine (1번만)
sudo usermod -aG docker vagrant
재접속
docker ps
ansible 에서 docker vm ssh 연결
ssh-keygen
ssh-copy-id vagrant@192.168.59.12
ssh-copy-id vagrant@192.168.59.13
vi .ansible.cfg
[defaults]
inventory = hosts.ini
vi hosts.ini
[ansible_host]
192.168.58.13
[docker_host]
192.168.59.12
ansible all -m ping
일단 maven
/*main
우선은 저장하고
apply 저장
다시 가서
apply 저장
이렇게 하고 테스트
오류
경로가 잘못 되었다고 한다..
또 오류..
경로를 쓰는것이지 도커파일을 쓸 필요는 엇다
도커 이미지 싹 지우고 다시 시작
빌드나우
패스워드를 위해 매개변수로..
MSG
HelloWorld
컨테이너가 없는 상태에서 삭제를 하면 삭제가 안된다.
에러 오타
에러 해결
여기서 --name 옵션을 중간으로 옮기고 시작
변수명도 중요하다 남이 보고 이해할 수 있게
또 실행해도
멱등성 해결
https://github.com/c1t1d0s7/my-java-maven
"{{ lookup('env', 'PASS') }}"
볼트를 써도 됨
도커 패스워드에 특수문자가있으면 젠킨스에서 잘 못읽음
PASS=`echo $PASS` ansible-playbook java-hello-world/docker_build_and_push.yaml
tasks 넣어주어야함
- name: Docker Image Build and Push
hosts: ansible_host
gather_facts: false
tasks:
- command: docker image build -t c1t1d0s7/java-hello java-hello-world/
- command: docker login -u c1t1d0s7 -p "{{ lookup('env', 'PASS') }}"
- command: docker push c1t1d0s7/java-hello
- command: docker logout
- name: Docker Run
hosts: docker_host
gather_facts: false
tasks:
- command: docker container rm -f java-hello-world
ignore_errors: yes
- command: docker container run -d -p 8080:8080 --name java-hello-world java-hello
git commit
git push 해주고..
실행해줌..
다시 실행
이 모듈들을 사용할 예정..
https://docs.ansible.com/ansible/2.9/modules/docker_container_module.html#docker-container-module
- hosts: docker_host
gather_facts: no
tasks:
- name: Create a data container
docker_container:
name: myweb
image: nginx
오류가 남
Docker SDK가 필요하다고 함
pip설치를 먼저 해주고
sudo apt install python3-pip
sudo pip3 install docker
모듈을 사용하기 위한 requirement를 꼭 확인하기를 바람..
이런 다양한 예시들이 있음
빌드하고
로그인하고
push하고
docker_container로 run하고
이렇게 하면 기존에 있던거를 지우고 다시 생성하게 됨
### 연습..
- name : Log into DockerHub
docker_login:
username: repush
password: "{{ lookup('env','PASS') }}"
- name : Build image and with build args
docker_image:
name: myhello
build:
path: /path/to/build/dir
args:
log_volum: /var/log/myapp
listen_port: 8080
source: build
- name: Tag and Push to docker hub
docker_image:
name: myhello
repository: repush/myhello
push: yes
source: local
오류..
오류..
이렇게 구성해서 테스트를 하면댐..
https://github.com/c1t1d0s7/my-java-maven
오후에는 쿠버네티스
이거 대신에 쿠버네티스에 올리는식으로..
kubeadm을 할 예정임
여기에 도커 kubeadm을 설치할 예정
https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
kubelet kubectl도 설치해야함
sudo apt-get install kubeadm=1.22.8-00 kubelet=1.22.8-00 kubectl=1.22.8-00 -y
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
calico랑 cni
kubeadm으로 설치하는 방법..
https://prod.velog.io/@repush/Kubernetes%EB%A5%BC-adm%EC%9C%BC%EB%A1%9C-%EC%84%A4%EC%B9%98
ip는 맞춰주셔야함
192.168.59.12번..
이거 대신에 간단하게 커맨드를 가지고
쿠버네티스를 실행할 수 있도록..
여기에 오브젝트 yaml파일을 만들어보면 됨..
오류
두 가지 방식이 있을 수 있음
kubectl과 kubeconfig를 설치해서
A에다가 kubectl apply를 할 수 있게 완성을 해보면 된다.
https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-linux/
오류발생
성공
이렇게 하게 되면
태그가 ..
이미지가 안바뀐다..
해결
이건 임시방편이고
중요한건 이미지 태그를 어떻게 달리 할것인가
가장 쉬운 방법이 무엇인가?!
빌드 할 때마다 매개변수를 수동으로 바꾸는식..
빌드번호를 연결해서 태그잡으면 됨
진자템플릿으로 해서 변수처리를 해서
플레이북에서
이렇게하면 템플릿에 의해서 빌드넘버를 받아서 할 수 도 있고..
해결해야하는 과제 is like..
https://pypi.org/
https://github.com/openshift/openshift-restclient-python
이렇게 하면 안됨..
sudo pip install openshift==0.11
sudo pip install kubernetes==11.0
### 물론 이렇게 해도 됨
이렇게 할 수 도 있다.
이게 진자 템플릿임
yml파일에 변수가 있다면 변수를 읽어서 만들게 될 것이다..
이 구성에 빌드넘버를 변수로 받아서 실행하도록 만들어야함..
이런식으로 하면 모든 브랜치를 참조하게 된다
이런식으로 브랜치 이름으로 태그가 될 수있게 할 수도 있음
특별히 다른건없고 디렉토리만 깔끔하게 추가한것임
앤서블에 k8s모듈을 사용하면
더 쉽게 할 수 있다고 하심..
개발자는 Git에 push만해도 이렇게 배포가 되는것을 확인할 수 있다.
GitOps라는것도 있다.
요즘에 뜨는 데브옵스이다.
즉 Git에 코드를 올리면 완전하게 배포가 완료되는 것을 알 수 있다.
다음주에 ArgoCD
를 사용해볼 예정
Jenkinsfile이라는게 있다.
Jenkins를 IaC로 구성할 수 있다.
미니프로젝트 기본주제는
배웠던거와 ArgoCD까지해서
AWS에서 구현하는것
EC2올리고 EKS 올려서 구성해보는걸로
아니면 EKS에 올리고 Jenkins같은것도 Pod형태로 띄울 수가 있다...
또는 똑같이 구성을 하는데 Jenkins파일로 구성하는거
또는 멀티 브랜치
또는 자바 말고 파이썬이나 고랭 파일로 해볼 수 있다...