Search
Duplicate
📒

[Jenkins] 03. 젠킨스 + Ansible + Kubernets 구조 만들기

상태
완료
수업
Jenkins
주제
기본개념
4 more properties
참고

Jenkins + Ansible

NOTE
Ansible은 여러개의 서버를 효율적으로 관리할 수 있게 해주는 환경 구성 자동화 도구이다!
강의 최종결과 아키텍쳐
Jenkins 구조
Jenkins + Ansible 구조
아직 제대로 사용해보지 않아서 Ansible을 사용함으로서 얻는 장점이 크게 다가오지 않지만 강의에서는 다음과 같이 설명한다.
스크립트를 관리하기 편리해지고, 다중서버 배포를 관리하기 좋아진다.
Ansible은 일관된 구성을 보장하므로, 환경차이로 인한 오류를 줄일 수 있다.
Playbook과 같이 IAC를 통한 버저닝 및 재활용이 가능하다.
agent(작업 수행자)가 존재하지 않아서, 중앙 관리 서버에서 직접 관리 대상 서버에 명령을 실행할 수 있다.
일반적으로 Ansible을 통해 하는일은 설치, 파일 및 스크립트 배포, 다운로드, 실행등의 작업을 진행한다.
yum install ansible ansible --version /etc/ansible/ansible.cfh # 환경 설정파일 /etc/ansible/hosts # ansible 호스트 목록
Bash
복사

Inventory, Playbook

NOTE
Ansible은 inventory를 통해 관리 호스트 목록을 관리하고, playbook을 통해 실행할 작업을 코드화 한다!
[webservers] webserver1.example.com webserver2.example.com [dbservers] dbserver1.example.com
Bash
복사
인벤토리 예제
- name: Apache 서버 설치 및 시작 hosts: webservers tasks: - name: Apache 패키지 설치 yum: name: httpd state: present - name: Apache 서비스 시작 및 활성화 service: name: httpd state: started enabled: yes
YAML
복사
플레이북 예제

Jenkins + Ansible 실습환경 서버구성

NOTE
전체 아키텍쳐
SSH 설정
docker pull edowon0623/ansible # 도커 서버 생성 docker run --privileged --name docker-server \ -itd -p 10022:22 -p 8082:8080 \ -e container=docker \ -v /sys/fs/cgroup:/sys/fs/cgroup:rw \ --cgroupns=host edowon0623/docker-server:intel /usr/sbin/init # ansible 서버 생성 docker run --privileged --name ansible-server -itd \ -p 20022:22 \ -p 8081:8080 \ -e container=docker \ -v /sys/fs/cgroup:/sys/fs/cgroup:rw \ --cgroupns=host edowon0623/ansible:latest /usr/sbin/init docker network inspect bridge # 각 서버 ip확인 ssh-keygen ssh-copy-id root@[ansible-sever ip] ssh root@localhost -p 20022 yum install -y ncurses ansible --version
Bash
복사
실습환경 서버구성

ansible 실습

NOTE
# 실행 옵션 # -i(inventory): 적용될 호스트 # -m(module-name): 모듈선택 # -k(ask-pass): 관리자 암호요청, -K(ask-become-pass): 관리자 권한상승 # --list-hosts: 적용되는 호스트 목록 # 멱등성 테스트 echo -e "[mygroup]\n172.17.0.5" >> /etc/ansible/hosts # 일반 코드 ansible all -m ping # ping: 통신테스트 ansible all -m shell -a 'free -h' # shell: 명령실행 ansible all -m copy -a "src=./test.txt dest=/tmp" ansible devops -m yum -a "name=httpd state=present"
Bash
복사
ansible 실행
- name: Add an ansible hosts hosts: localhost tasks: - name: Add a ansible hosts blockinfile: # 'blockinfile' 모듈을 사용하여 파일 내에 특정 블록의 내용을 관리 path: /etc/ansible/hosts block: | [mygroup] 172.17.0.5
YAML
복사
멱등성 특성으로 해당 작업을 여러번 수행해도 한번만 적용된다.
- name: Ansible Copy Example Local to Remtoe hosts: devops tasks: - name: copying file with playbook copy: src: ~/sample.txt dest: /tmp owner: root mode: 0644
YAML
복사
파일복사
--- - name: Download Tomcat9 from tomcat.apache.org hosts: all become: yes become_user: root tasks: # 디렉토리 생성 또는 속성 변경을 위한 모듈 - name: Create a Directory /opt/tomcat9 file: path: /opt/tomcat9 state: directory mode: 0755 # 원격 URL에서 파일을 다운로드하기 위한 모듈 - name: Download the Tomcat checksum get_url: url: https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.85/bin/apache-tomcat-9.0.85.tar.gz.sha512 dest: /opt/tomcat9/apache-tomcat-9.0.85.tar.gz.sha512 # 쉘 명령어를 실행하는 모듈 - name: Register the checksum value shell: cat /opt/tomcat9/apache-tomcat-9.0.85.tar.gz.sha512 | grep apache-tomcat-9.0.85.tar.gz | awk '{ print $1 }' register: tomcat_checksum_value # 실행 결과를 변수에 저장 - name: Download Tomcat using get_url get_url: url: https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.85/bin/apache-tomcat-9.0.85.tar.gz dest: /opt/tomcat9 mode: 0755 checksum: sha512:{{ tomcat_checksum_value.stdout }}"
YAML
복사
tomcat 다운로드
- hosts: all # become: true tasks: - name: stop current running container command: docker stop my_cicd_project ignore_errors: yes - name: remove stopped cotainer command: docker rm my_cicd_project ignore_errors: yes - name: remove current docker image command: docker rmi cicd-project-ansible ignore_errors: yes - name: build a docker image with deployed war file command: docker build -t cicd-project-ansible . args: chdir: /root - name: create a container using cicd-project-ansible image command: docker run -d --name my_cicd_project -p 8080:8080 cicd-project-ansible
YAML
복사
Docker build 코드
ansible-playbook -i hosts first-devops-playbook.yaml # playbook, inventyory 지정해서 사용
Bash
복사
- hosts: all # become: true tasks: - name: create a docker image with deployed waf file command: docker build -t scofe/cicd-project-ansible . args: chdir: /root - name: push the image on Docker Hub command: docker push scofe/cicd-project-ansible ignore_errors: yes - name: remove the docker image from the ansible server command: docker rmi scofe/cicd-project-ansible ignore_errors: yes
YAML
복사
도커 이미지 빌드(CI)
- hosts: all # become: true tasks: - name: stop current running container command: docker stop my_cicd_project ignore_errors: yes - name: remove stopped cotainer command: docker rm my_cicd_project ignore_errors: yes - name: remove current docker image command: docker rmi scofe/cicd-project-ansible ignore_errors: yes - name: pull the newest docker image from Docker Hub command: docker pull scofe/cicd-project-ansible - name: create a container using cicd-project-ansible image command: docker run -d --name my_cicd_project -p 8080:8080 scofe/cicd-project-ansible
YAML
복사
도커 이미지 배포(CD)
ansible-playbook -i hosts create-cicd-devops-image-playbook.yaml \ --limit 172.17.0.2 ansible-playbook -i hosts create-cicd-devops-container-playbook.yaml \ --limit 172.17.0.3
Bash
복사

Jenkins + Ansible + Kubernets

NOTE
쿠버네티스를 사용해서 자동화를 컨테이너 오케스트레이션 레벨로 확장해서, 높은 확장성과 가용성을 보장할 수 있다!
minikube service cicd-service --url # IP확인 [ansible-server] localhost [kubernetes] 10.0.2.15
Bash
복사
쿠버네티스 ip확인
ansible -i ./k8s/hosts kubernetes -m ping -u scofe
Bash
복사
핑 테스트

Ansible + Kubernetes 실습

NOTE
- name: Create pods using deployment hosts: kubernetes # become: true # user: ubuntu tasks: - name: delete the previous deployment command: kubectl delete deployment.apps/cicd-deployment - name: create a deployment command: kubectl apply -f cicd-devops-deployment.yaml
YAML
복사
apiVersion: apps/v1 kind: Deployment metadata: name: cicd-deployment spec: selector: matchLabels: app: cicd-devops-project replicas: 2 template: metadata: labels: app: cicd-devops-project spec: containers: - name: cicd-devops-project image: scofe/cicd-project-ansible imagePullPolicy: Always ports: - containerPort: 8080
YAML
복사
cicd-devops-deployment.yaml
- name: create service for deployment hosts: kubernetes # become: true # user: ubuntu tasks: - name: create a service command: kubectl apply -f cicd-devops-service.yaml
YAML
복사
apiVersion: v1 kind: Service metadata: name: cicd-service labels: app: cicd-devops-project spec: selector: app: cicd-devops-project type: NodePort ports: - port: 8080 targetPort: 8080 nodePort: 32000
YAML
복사
cicd-devops-service.yaml
ansible-playbook -i ./k8s/hosts k8s-cicd-deployment-playbook.yaml -u scofe ansible-playbook -i ./k8s/hosts k8s-cicd-service-playbook.yaml -u scofe
Bash
복사
deployment + service 배포