Search
Duplicate
📒

[Devops Study] 07. 자율배포 - Ansible로 서버환경 구성 & 배포코드 작성

상태
완료
수업
Devops Study
주제
4 more properties
참고

개발과정

인벤토리 설정

NOTE
Ansible에서 사용할 서버들을 등록한다.

1. ect/ansible/hosts 파일 사용

해당 파일에 직접 구성하면, 이후 명령에 -i , --inventory 명령어로 인벤토리를 지정할 필요가 없어짐
이번에 사용하지 않음

2. inventory 파일 직접구축

다양한 환경, 프로젝트 또는 팀에 맞는 여러 인벤토리를 만들고 구성할 수 있다.
Git을 이용하여 변경 사항을 추적하고 인벤토리 파일에 대해 협업이 가능!
all: # 인벤토리의 모든 호스트에 적용되는 그룹 수준 변수 정의 # 이 경우 모든 호스트에 대해 변수를 설정한다. vars: ansible_user: ubuntu ansible_ssh_private_key_file: "/ect/ansible/semsekey.pem" # 모든 하위 그룹을 포함하는 그룹정의 # 아래의 그룹들을 all의 하위그룹으로 포함한다. children: ansible_server: hosts: 10.0.1.21: data_instance_server: hosts: 10.0.1.31: 10.0.1.95: 10.0.1.128: 10.0.1.113: 10.0.1.17: 10.0.1.19: kafka_server: hosts: 10.0.1.44: 10.0.1.107: 10.0.1.254:
YAML
복사
inventory.yaml

Ansible의 SSH 통신

NOTE
인벤토리에서 설정한 IP들과 SSH통신을 하기위한 설정

방법 1 (scp를 통한 ssh pub복사)

ssh-copy--id [아이디]@[복사할 서버]
Bash
복사
RSA 암호화를 사용해서 연결이 가능하며 다음의 과정을 따른다.
1.
사용자는 RSA키 쌍(public, private)을 생성한다.
2.
ssh-copy-id 명령어를 사용하여 로컬 컴퓨터의 공개 키를 원격 서버의 .ssh/authorized.keys 파일에 추가한다.
3.
사용자가 원격 서버에 SSH로 접속을 시도하면, 서버는 클라이언트에게 임의의 메시지를 전송하고, 사용자는 받은 메시지를 개인 키로 암호화 시킨다.
4.
암호화된 메시지를 다시 서버에 전송하고, 서버는 클라이언트가 암호화한 메세지를 공개키로 복호화한다.
5.
서버는 복호화된 메시지와 처음 전송했던 메시지가 일치하는지 확인하고, 올바른 개인 키를 가지고 있는지 검증하고 성공하면 연결된다.

방법 2(pem키를 통합 접속)

scp -i [접속 키 경로] [복사 파일 경로] [서버 아이디]@[서버 IP]:[복사받을 파일 경로]
Bash
복사
scp 명령어 구조 → pem키를 복사하기 위해 사용
ssh -i [.pem키 경로] [서버 아이디]@[서버 IP]
Bash
복사
pem키를 활용해 ssh로 접속
EC2생성시 설정한 .pem키를 이용해 서로 접속을 한다.

전체 서버 Playbook

NOTE
각 서버에 필요한 프로그램(docker)을 설치한다!
Docker & Java 설치
Python 설치
Docker Network 생성

데이터 서버 Playbook

NOTE
데이터 생성/송신 Springboot를 배포하고, InfluxDB를 설치한다!
- name: Docker 컨테이너로 Spring Boot 애플리케이션 배포 hosts: data_instance_server become: yes vars: app_image: scofe/data_generator tasks: - name: Install Docker SDK for Python ansible.builtin.pip: name: docker state: present # Docker 이미지를 끌어 오기 - name: Pull Spring Boot Docker image ansible.builtin.docker_image: name: "{{ app_image }}" source: pull - name: Deploy container 1 include_tasks: deploy_container.yml vars: app_container_name: spring_boot_app_container1 app_profile: "{{ spring_profiles.container1[inventory_hostname] }}" app_port: 8080 - name: Deploy container 2 include_tasks: deploy_container.yml vars: app_container_name: spring_boot_app_container2 app_profile: "{{ spring_profiles.container2[inventory_hostname] }}" app_port: 8081
YAML
복사