ansible playbook

bunny.log·2023년 6월 21일
0

playbook이라는 것은 미리 작성된 스크립트를 가지고 지정된 서버에다가 동일한 작업을 할수 있게끔 제공 되는 기능이다.

엔서블 명령어 설명

-i : 인벤토리 파일을 지정
INVENTORY --inventory-file=INVENTORY: 인벤토리 파일을 지정합니다. 인벤토리 파일은 Ansible 작업을 수행할 호스트 또는 호스트 그룹을 정의합니다.

-m : 모듈의 이름을 지정
MODULE_NAME, --module-name=MODULE_NAME: 사용할 모듈의 이름을 지정합니다. Ansible 모듈은 원격 호스트에서 특정 작업을 수행하는 재사용 가능한 코드 단위입니다.

-a : 모듈에 전달할 인수를 지정
MODULE_ARGS, --args=MODULE_ARGS: 모듈에 전달할 인수를 지정합니다. 이러한 인수는 모듈에 따라 다르며 수행할 특정 작업이나 동작을 정의합니다.

-u : 원격 호스트에 연결할 때 사용
REMOTE_USER, --user=REMOTE_USER: 원격 호스트에 연결할 때 사용할 원격 사용자를 지정합니다. 이 옵션을 사용하여 인증에 사용할 사용자 이름을 지정할 수 있습니다.

-k
--ask-pass: 원격 호스트에 연결할 때 SSH 암호를 입력하도록 요청합니다. 이 옵션은 암호 기반 인증이 필요한 경우 사용됩니다.

-K
--ask-become-pass: 원격 호스트에서 권한 상승(루트 권한)에 사용할 암호를 입력하도록 요청합니다. 이 옵션은 관리자 권한이 필요한 작업을 수행할 때 사용됩니다.

-b : 관리자 권한으로 작업을 수행
--become: 관리자 권한으로 작업을 수행합니다. 이 옵션은 특정 작업이 루트 권한을 필요로 할 때 사용됩니다.

--limit
Ansible 플레이북이 실행되는 대상 호스트를 제한하는 데 사용됩니다.

Ansible-playbook -I hosts first-devops-playbook.yml —limit 172.17.0.2

플레이북 대상을 어떤 아이피에 적용할 것인지를 적어준다.

--check : 시뮬레이션으로 동작하도록 지정
Ansible 플레이북을 실제로 실행하지 않고, 단지 시뮬레이션으로 동작하도록 지정하는 옵션입니다. 이 옵션을 사용하면 실제 변경 사항을 가하지 않고도 플레이북이 어떤 작업을 수행할 것인지 미리 확인할 수 있습니다. 실행 전에 어떤 변경 사항이 발생하는지 미리 파악하고 싶을 때 유용합니다.

hosts 파일을 인벤토리로 사용하고, first-devops-playbook.yml 플레이북을 시뮬레이션 모드로 실행하여 어떤 변경 사항이 발생하는지 미리 확인하려는 명령어입니다. 실제로 작업을 수행하지 않고 단지 시뮬레이션만 실행됩니다.

blockinfile

파일에 특정한 블록을 만들어 어떤 내용을 추가

---
  - name: Ansible_vim
    hosts: localhost
    tasks:
      - name: Add ansible hosts
        blockinfile: 
          path: /etc/ansible/hosts
          block: |
            [mygroup]
            172.17.0.5

ssh 서버 root에서 playbook을 적어준다.

ansible-playbook first-playbook.yml

명령어를 실행해 준다.

playbook에서 입력한 내용이 아래처럼 /etc/ansible/hosts 내부에 삽입된것을 볼 수 있다.

copy

/etc/ansible/hosts 등록된 [devops] 서버들을 대상으로 playbook파일이 존재하는 디렉터리에 위치한 sample.txt 파일을 ssh대상 서버의 /tmp 폴더 안에 복사 하는 내용이다.

---
  - name: Ansible Copy Example Local to Remote
    hosts: devops
    tasks:
      - name: copying file with playbook
        copy: 
          src : ~/sample.txt
	      dest: /tmp
	      owner: root
          mode: 0644

get_url

실제파일을 url을 가지고 다운로드 하는 내용이다.

---
  - name: Download Tomcat9 from tomcat.apache.org
    hosts: devops
    tasks:
      - name: Create a Directory /opt/tomcat9
        file: 
          path : /opt/tomcat9
	  state: directory
	  mode: 0755
      - name: Download Tomcat using get_url
        get_url: 
          path : https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.65/bin/apche-tomcat-9.0.65.tar.gz
	  dest: /opt/tomcat9
	  mode: 0755
	  checksum: sha512:https:downloads.apache.org/tom…..

/etc/ansible/hosts 등록된 [devops] 서버들을 대상으로 /opt/tomcat9 이 만들어졌으며 https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.65/bin/apche-tomcat-9.0.65.tar.gz 경로에 파일이 다운로드 된 것을 확인 할 수 있다.

Jenkins + Ansible Playbook

Exec command 안에 아래 명령어를 입력하고 젠킨스에서 지금 빌드 버튼을 누르면
아래 플레이북 내용으로 빌드 된다.

ansible-playbook -i hosts first-devops-playbook.yml

first-devops-playbook.yml

---
    hosts: all

    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: pull the newest docker image from Docker Hub
	command : docker pull edowon0623/cicd-project-ansible
	ignore_errors : yes


      - name: remove current docker image
	command : docker rmi cicd-project-ansible

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

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

엔서블 서버에서 도커서버로 배포하는 내용

ansible-server에서 관리하는 모든 노드서버에서 이미지를 매번 다시 만들어서 docker-hub에 push하는 작업은 의미가 없으므로

이미지를 생성하는 작업은 ansible-server(172.17.0.3)일 때만 컨테이너를 생성하는 작업은 docker-server(172.17.0.4)일 때만 작업해 주겠다.

위의 docker images에서 이미지 리스트중 유저 계정정보가 없는 cicd-project-ansible 이미지를 볼수 있다.

docker tag cicd-project-ansbile edowon0623/cicd-project-ansible

위 명령어를 통해 새로운 이미지가 태그가 하나 붙어서 생성 된다.

docker images로 이미지 리스트의 정보를 보면 IMAGE ID 는 같지만 레파지토리의 이름이 다른 이미지 리스트가 보인다.

Docker push edowon0623/cicd-project-ansible

명령어를 통해 도커허브에 컨테이너를 푸시해준다.

<기존 hots 파일 이미지>

이미지를 생성하는 playbook

이미지를 생성하는 작업 ansible-server(172.17.0.3)

---
     hosts: all

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

      - name: push the image on Docker Hub
	command : docker push edowon0623/cicd-project-ansible

      - name: remove the docker image from the ansible server
	command : docker rmi edowon0623/cicd-project-ansible
	ignore_errors : yes

컨테이너를 생성하는 playbook

docker-server (172.17.0.4) 에서만 컨테이너 생성

---
     hosts: all

    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 edown0623/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-projectpansible

  • 이미지 삭제
  • 이미지 다운로드
  • 이미지를 가지고 컨테이너를 생성하는 부분이 추가 되었다.

ansible server 서버에서 172.17.0.3 에만 create-cicd-devops-image.yml 플레이북 파일을 실행해 준다.

ansible server 서버에서 172.17.0.4 에만 플레이북 파일을 실행해 준다.


위 명령어 실행시 아래처럼 에러가 나는 이유는 현재 이미지나 컨테이너가 생성되어 있지 않아 stop, remove등의 명령어 실행시 에러가 나는 것이고 플레이북 파일 내에서 에러가 나도 무시 하도록 명령어가 입력 되어있어 무시된 상황이다.

다시 같은 명령어를 실행하면 위의 에러메시지가 사라지고 정상적으로 컨테이너가 생성 된것을 볼 수 있다.

지금 빌드 후 아래 ansible-server에서 도커 이미지를 조회해보면 playbook파일에서 도커 이미지를 삭제하여 이미지 조회가 되지 않는 것을 알수 있다.

docker-server에서는 컨테이너가 방금 생성된 것을 조회 할수 있다.

.
.
.
.
.
.
.
.
.

참고
https://www.inflearn.com/course/lecture?courseSlug=%EC%A0%A0%ED%82%A8%EC%8A%A4-ci-cd-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8&unitId=123673&tab=curriculum

profile
https://github.com/nam-yeun-hwa

0개의 댓글