[Jenkins] Ansible Playbook

2023. 8. 20. 22:07초기 과업/DevSecOps

작성자알 수 없는 사용자

728x90
반응형

 

안녕하세요. 기깔나는 사람들에서 DMSO를 맡고있는 정우입니다.

지난번 IaC와 Ansible을 살펴보고

Ansible의 기본적인 명령어를 사용해봤는데,

[Jenkins] IaC 와 Ansible의 이해

오늘은 Ansible playbook을 사용하는 것을 배워보겠습니다.

 


Ansible Playbook

Playbook이란 : 사용자가 원하는 내용을 미리 작성해두는 파일입니다. 

- ex) 설치, 파일전송, 서비스 재시작

- ex) 다수의 서버에 반복작업을 처리하는 경우

 

first-playbook.yml 파일을 하나 생성해주겠습니다.

 

---
  - name: Add an ansible hosts
    hosts: localhost
    tasks:
      - name: Add a ansible hosts # 작업의 이름
        blockinfile:              # 파일에 특정한 파일을 추가한다
          path: /etc/ansible/hosts  # 어느파일에 설정해줄것인가
          block: |             # | 하이픈 무조건 필수!!
            [mygroup]
            172.17.0.8

 

 

playbook 실행

ansible-playbook <내가 만든 playbook.yml>

 

실행된 결과를 보니 mygroup이 추가된 것이 확인됩니다.

 


멱등성 확인

지난번 잠시 ansible의 특징인 멱등성을 잠깐 얘기해보았습니다.

기존엔 어떻게 실행됐고 ansible을 사용하면 어떻게 되는지 확인해볼게요

 

멱등성 : 같은 설정을 여러번 적용하더라도 결과가 달라지지 않는 성질

 

예를들어 기본적으로 같은내용이 추가되게 되면

 echo -e "[mygroup]\n172.17.0.7" >> /etc/ansible/hosts

이렇게 뒤에 계속 추가가 되는 것을 볼 수 있습니다.

 

하지만 ansible-playbook을 통해 다시 한번 추가해볼게요

위와는 다르게

같은 내용은 무시되는 것을 볼 수 있습니다.

 


실습. 

 

1. playbook을 이용해 devops 서버만 파일을 복사해볼게요

- 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

 

해설: 

더보기

 

 

5번서버 확인

 

 

2. 톰캣9점대를 설치하도록 해보자

---
- name: Download Tomcat9 from tomcat.apache.org
  hosts: all
  tasks:
   - name: Create a Directory /opt/tomcat-9
     file:
       path: /opt/tomcat-9
       state: directory
       mode: 0755
   - name: Download the Tomcat checksum
     get_url:
       url: https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.74/bin/apache-tomcat-9.0.74.tar.gz.sha512
       dest: /opt/tomcat-9/apache-tomcat-9.0.74.tar.gz.sha512
   - name: Register the checksum value
     shell: cat /opt/tomcat-9/apache-tomcat-9.0.74.tar.gz.sha512 | grep apache-tomcat-9.0.74.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.74/bin/apache-tomcat-9.0.74.tar.gz
       dest: /opt/tomcat-9
       mode: 0755
       checksum: sha512:{{ tomcat_checksum_value.stdout }}"

 

 

해설: ▼

더보기

새로운 playbook을 만들기 이전에 /opt/tomcat9가 있는지 확인해볼게요

tomcat9-playbook을 실행해주겠습니다.

 

tomcat 파일이 생성된 것이 보입니다!

 


Jenkins + Ansible 연동하기

 

 

1. SSH 설정: 

Dashboard > Jenkins관리 > System

 

우선 제 jenkins 서버에서 Ansible 서버로 접속해볼게요

 

 

 

Publish over SSH로 이동해서 docker-server이외에 하나 더 추가해줄게요

 

Name : ansible-host

Hostname : 내 Ansible 서버의 IP (172.17....)

Port : 22로 설정해주었습니다.

 

 

 

2. Project 생성

 

 

 

와르파일을 우선 ansible에 복사하고

각각의 war파일을 다른 서버에 playbook을 사용해서 배포할 수 있도록 해보겠습니다.

 

빌드 후 조치로 이동

 

build 해보고 확인해보겠습니다.

 

 

와르파일이 생성되었습니다.

 

jenkins와 연동할 플레이북을 생성하겠습니다.

- hosts: all
#   become: true

  tasks:
  - name: build a docker image with deployed war file
    command: docker build -t cicd-project-ansible .
    args:
        chdir: /root

Dockerfile과 war파일이 있는 것을 playbook을 사용해서 build 해보겠습니다.

 

우선 Test를 위해

ansible서버 포트만 있는 호스트 파일을 임시로 만들어주겠습니다.

 

ansible-playbook -i <임시로 만들어준 호스트 파일> <playbook>.yml

 

 

 

이미지를 확인해보겠습니다.

 

이미지가 생성이 됐으면 컨테이너를 실행해보겠습니다.

- hosts: all
#   become: true  

  tasks:
  - 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
ansible-playbook -i hosts first-devops-playbooks.yml

컨테이너가 잘 만들어 진것이 확인됩니다.

 

 

테스트가 완료되면 젠킨스에서 테스트 해보겠습니다.

 

테스트 전에 image와 containser를 삭제해주고 진행해주겠습니다.

 

 

 

빌드를 해보겠습니다.

 

 

 

성공입니다.

 

아래와 같은 playbook을 사용하면 

다시 컨테이너를 삭제하고 생성하면서 poll scm을 사용했을 때 에러없이 지속적인 수정이 가능합니다 .

- 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 edowon0623/cicd-project-ansible
    ignore_errors: yes

  - name: pull the newest docker image from Docker Hub
    command: docker pull edowon0623/cicd-project-ansible

  - name: create a container using cicd-project-ansible image
    command: docker run -d --name my_cicd_project -p 8080:8080 edowon0623/cicd-project-ansible

 

 


오늘은 Ansible playbook을 Jenkins에 등록해서 사용해 보았습니다.

다음 시간엔 쿠버네티스에 대해 알아보도록 하겠습니다.

 

 

 

 

 

 


참고자료

🔗 - 인프런- Jenkins를 이용한 CI/CD Pipeline 구축

 

 

 

 

728x90
반응형