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 플레이북을 시뮬레이션 모드로 실행하여 어떤 변경 사항이 발생하는지 미리 확인하려는 명령어입니다. 실제로 작업을 수행하지 않고 단지 시뮬레이션만 실행됩니다.
파일에 특정한 블록을 만들어 어떤 내용을 추가
---
- 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 내부에 삽입된것을 볼 수 있다.
/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
실제파일을 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 경로에 파일이 다운로드 된 것을 확인 할 수 있다.
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 파일 이미지>
이미지를 생성하는 작업 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
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
위 명령어 실행시 아래처럼 에러가 나는 이유는 현재 이미지나 컨테이너가 생성되어 있지 않아 stop, remove등의 명령어 실행시 에러가 나는 것이고 플레이북 파일 내에서 에러가 나도 무시 하도록 명령어가 입력 되어있어 무시된 상황이다.
다시 같은 명령어를 실행하면 위의 에러메시지가 사라지고 정상적으로 컨테이너가 생성 된것을 볼 수 있다.
지금 빌드 후 아래 ansible-server에서 도커 이미지를 조회해보면 playbook파일에서 도커 이미지를 삭제하여 이미지 조회가 되지 않는 것을 알수 있다.
docker-server에서는 컨테이너가 방금 생성된 것을 조회 할수 있다.
.
.
.
.
.
.
.
.
.