참고
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
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 배포