어쩌다 IT
article thumbnail
반응형

리뷰 (Review)

더보기

IaC

  • Infrastructure as Code, 프로그래밍형 인프라
  • 인프라 구성을 코드를 통해 자동으로 구축, 관리, 프로비저닝
  • 비용 절감, 배포 속도 향상, 휴먼 에러 감소, 인프라 일관성 향상 (멱등성)

 

용어

  • 프로비저닝 - provisioning
    • 클라우드 서비스를 시작하고 구성하는 것을 프로비저닝이라 한다.
    • 인프라를 설정하는 프로세스로 시스템, 데이터, 네트워크 작동을 준비하는 과정을 의미
  • 형상 관리 - configuration management
    • 이력 관리
    • 서버 운영상 필요한 소프트웨어를 설치하고 설정으로 관리하는 것
    • 설정 관리에 사용되는 여러 정보 이력을 관리
  • 오케스트레이션 - orchestration
    • 여러 시스템 또는 서비스를 조정하는 것
    • 오케스트레이션의 목표는 배포, 관리, 확장, 네트워킹 자동화

 

AWS CloudFormation

  • AWS 대표적인 IaC 구성 조정 도구
  • 인프라 관리 간소화, 신속하게 인프라 복제, 인프라 변경 사항을 쉽게 제어 및 추적이 가능
  • JSON 또는 YAML을 이용하여 작성

 

AWS CloudFormation 구성 요소

  • 템플릿 - Template
    • 스택 리소스 프로비저닝 및 구성을 위해 필요한 텍스트 파일
    • JSON 또는 YAML 형식의 파일로 작성
    • AWS CloudFormation 템플릿을 AWS 리소스 구축을 위한 blueprint로 사용
    • blueprint - 청사진, 아키텍처 또는 공학 설계를 문서화한 기술 도면, 설계도라 보면 됨
  • 스택 - Stack
    • 하나의 단위로 관리할 수 있는 AWS 리소스 모음
    • 스택의 생성, 업데이트, 삭제를 통해 리소스들의 생성, 업데이트, 삭제
    • 스택의 모든 리소스는 AWS CloudFormation 템플릿을 통해 정의

 

템플릿 구성 요소

  • AWSTemplateFormatVersion
  • Description
  • Metadata
  • Parameters
  • Mapping
  • Conditions
  • Transform
  • Resources (필수 사항) - AWS 리소스 및 해당 속성 지정
  • Outputs

Ansible 개요

 

IaaS - Infrastructure as a Service

  • Cloud를 통해 가상 머신 환경을 온디멘드로 제공

 

IaC - Infrastructure as Code

  • 인프라 구성을 코드를 통해 자동으로 구축, 관리, 프로비저닝
  • 인프라 (Infra)
    • 시스템을 가동하기 위해 전제가 되는 주변 환경 모두를 의미
    • 서버와 네트워크 계층을 다루는 것 - IaC
    • 미들웨어와 Application 배포 등의 상위 계층을 다루는 것 - CaC (Configuration as Code)
    • 넓은 의미에서 IaC는 IaC와 CaC를 모두 포함해서 표현

 

IaC

  • 기존 인프라 관리 방법
    • shell script를 이용한 서버 환경 구성
      • script 방식은 CLI 환경에서 주로 사용
    • shell script를 이용하여 여러 개의 서버를 관리할 경우 일관성을 유지하기가 쉽지 않다.
    • shell script를 이용할 때 배포 관리에 대한 문제점이 있다.
  • IaC 기능을 수행하는 tools 이용 시
    • 코드를 기반으로 인프라 관리
    • 일관성 유지
    • 배포 관리가 쉽다.

Ansible

  • RedHat에서 개발
  • 파이썬으로 작성
  • 오픈 소스 방식으로 서버의 프로비저닝, SW 배포 등의 자동화를 관리해주는 도구
  • Ansible 특징
    • Agentless
      • 타 자동화 도구(Puppet, Chef 등)들은 타겟 대상들에 agent 설치 기반 pull 방식으로 동작
      • Ansible은 타겟 대상들에 Agentless 기반의 push 방식으로 동작하므로 기술적, 지리적 제한이 넓음
    • 멱등성 - Idempotency
      • 어떤 연산이 여러 번 수행되더라도 결과가 달라지지 않는 성질
      • Ansible은 동일한 모듈을 반복 실행해도 결과가 동일한 멱등성 있게 수행할 수 있다.
    • 재사용성 - Reusability
      • 기준 시스템 구성 정보를 재사용하여 손쉽게 인프라 구성 관리 수행

 

Ansible 구성 요소

  • 제어 노드 - Control node
    • Ansible을 실행하는 node
    • Ansible 제공 프로그램을 이용하는 매니지드 노드 관리
    • Ansible이 설치된 computer가 제어 노드가 된다.
    • 제어 노드와 매니지드 노드 사이는 SSH를 통해 통신한다.
  • 매니지드 노드 - Managed node
    • Ansible로 관리하는 서버를 매니지드 노드 또는 호스트(Host), 타겟(Target)이라 한다.
    • 매니지드 노드에는 Ansible이 설치되지 않는다.
  • 인벤토리 - Inventory
    • 매니지드 노드 목록
    • 인벤토리 파일은 호스트 파일이라고도 한다.
    • 인벤토리 파일은 각 매니지드 노드에 대한 IP Address, 호스트 정보, 변수와 같은 정보를 저장
  • 모듈 - Module
    • Ansible이 실행하는 코드 단위
    • 미리 만들어진 동작 관련 코드 집합
    • 각 모듈은 데이터베이스 처리, 사용자 관리, 네트워크 장치 관리 등 다양한 용도로 사용
    • 단위 모듈을 호출하거나 playbook에서 여러 모듈을 호출할 수 있다.
  • 테스크 - Task
    • Ansible 작업 단위
    • Ad-hoc 명령을 사용하여 단일 작업을 한 번 실행할 수 있다.
  • 플레이 북 - Playbook
    • 순서가 지정된 Task 목록
    • 지정된 작업을 해당 순서로 반복적으로 실행할 수 있다.
    • 플레이 북에는 변수와 작업이 포함될 수 있다.
    • YAML로 작성

 

Ansible 동작 과정

  • Ansible은 인벤토리 파일 내용 참조하여 관리 대상 매니지드 노드 파악
  • Ansible을 통한 매니지드 노드 관리 방법
    • 모듈을 통한 매니지드 노드 관리
    • Ad-hoc 명령을 통한 매니지드 노드 관리
    • Task 단위로 매니지드 노드 관리
    • 플레이 북을 이용한 매니지드 노드 관리

Ansible 환경 구축

 

실습 환경

Ansible Control Node 구축

  • Ansible Control node와 Managed node 연결
    • Control node는 Managed node와 연결 시 SSH를 통해서 연결한다.
    • Control node의 SSH key를 Managed node에 전송해야 한다.
    • AWS EC2 Instace 환경에서는 Control node에서 Managed node의 키 페어를 모두 가지고 있어야 한다.
  • Control node 구성
    • Ansible 환경 구성은 Control node에 구성하고 Managed node에는 특별한 환경 구성이 없다.
    • Ansible 설치
      • sudo amazon-linux-extras install ansible2 : Amazon Linux Ansible 설치 명령
      • ansible --version : Ansible 버전 확인
    • Ansible 환경 설정 파일
      • /etc/ansible/ansible.cfg : Ansible 환경 설정 파일
        • Ansible 호스트 키 검사 속성을 비활성화 설정
        • 처음 설치 시에는 ansible.cfg 파일에 주석 처리되어있는 부분 수정
          • host_key_checking = False
          • Control node에서 Managed node에 접속 시 별도의 key 확인 과정 없이 명령 수행하기 위함
      • /etc/ansible/hosts : 인벤토리 파일
    • Ansible 환경 설정 파일 적용 순서
      1. ANSIBLE_CONFIG 환경 변수에 지정된 파일 (지역 설정, 현재 사용자)
      2. 현재 디렉토리에 있는 ansible.cfg 파일 (지역 설정, 현재 사용자)
      3. 사용자 홈 디렉토리에 있는 ansible.cfg 파일 (지역 설정, 현재 사용자)
      4. /etc/ansible/ansible.cfg 파일 (글로벌 전역 설정, 모든 사용자)
    • Managed node와 연결 확인
      • Control node에서 Managed node와 연결하려면 Managed node에 대한 정보를 알고 있어야 한다.
      • /etc/ansible/hosts 파일은 인벤토리라고 하며 이 파일은 Managed node에 대한 정보를 기술한다.
      • /etc/ansible/hosts 파일은 전역으로 사용하는 인벤토리이며 현재 사용자에 대한 인벤토리를 구성하려면
        현재 사용자의 작업 디렉토리에 별도의 인벤토리를 작성해서 사용할 수 있다.

 

Ad-hoc 명령

  • Ansible은 일반적으로 playbook을 사용하도록 설계
  • 한 번만 수행하거나 간단한 명령을 통한 상태 확인 등은 별도의 playbook을 사용하지 않고 간단한 명령 구문으로 수행할 수 있는데 이 방식을 Ad-hoc 명령이라고 한다.
  • ansible <호스트명 패턴(Managed node)> [옵션]
    • -m : 모듈명
    • -a <인수 목록> : 모듈 인수
    • -i <인벤토리 파일> : 인벤토리 설정
      • 별도의 인벤토리를 지정하지 않으면 /etc/ansible/hosts 파일을 사용한다.
    • -k : 암호 확인
  • 예시
    • ansible managed -m ping -i ./hosts
      • managed 호스트 패턴에 대하여 ping 모듈 적용, 인벤토리는 현재 디렉토리의 hosts 사용
      • ping 모듈 - Ansible Control node와 Managed node 사이의 통신 연결 상태 확인
    • ansible all -m ping -i ./hosts
      • 호스트 패턴 all은 인벤토리의 모든 호스트에 대하여 Ad-hoc 명령 적용 시 사용하는 호스트 패턴

Inventory 이해

 

인벤토리 (Inventory)

  • 참고 자료
  • Control node에서 Managed node에 연결하기 위한 정보를 가지고 있는 파일
  • 기본 위치
    • /etc/ansible/hosts
  • 기본 위치의 파일은 default로 적용되는 인벤토리이고 관리자 권한으로만 수정 가능
  • 사용자가 원하는 디렉토리에 복사한 후 편집하여 사용
    • sudo cp /etc/ansible/hosts .
    • sudo chown <사용자 ID>:<사용자 그룹> <인벤토리 파일>
  • Ansible 설치 후 기본 인벤토리 내용은 사용법에 대한 주석으로 구성되어 있다.
# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
#   - Comments begin with the '#' character
#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses
#   - A hostname/ip can be a member of multiple groups

# Ex 1: Ungrouped hosts, specify before any group headers.

## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10

# Ex 2: A collection of hosts belonging to the 'webservers' group

## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110

# If you have multiple hosts following a pattern you can specify
# them like this:

## www[001:006].example.com

# Ex 3: A collection of database servers in the 'dbservers' group

## [dbservers]
## 
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57

# Here's another example of host ranges, this time there are no
# leading 0s:

## db-[99:101]-node.example.com

 

인벤토리 파일 구조

더보기
  • 그룹을 지정하지 않는 방식
    • <host name (managed node)> [속성] 

    • 12.12.12.12 ansible_host=12.12.12.12 ansible_connection=ssh ansible_port=22 ansible_user=ec2-user ansible_ssh_private_key_file=/key절대경로
  • 그룹을 지정하는 방식
    • [그룹명]
      <host name (managed node)> [속성]

    • [managed] 
      12.12.12.12 ansible_host=12.12.12.12 ansible_connection=ssh ansible_port=22 ansible_user=ec2-user ansible_ssh_private_key_file=/key절대경로
  • 공통 정보를 변수에 저장하여 공유하는 방식
    • [그룹명:vars]
      [속성]
      [그룹명]
      <host name (managed node)>

    • [managed:vars]
      ansible_connection=ssh → 연결 방법

      ansible_port=22 → 연결 Port number
      ansible_user=ec2-user  host(managed node) user id
      ansible_ssh_private_key_file=/key절대경로  개인키 파일 위치
      ansible_python_interpreter=/usr/bin/python3 → 파이썬 인터프리터 위치 지정
      [managed]
      12.12.12.12

      13.13.13.13
  • 여러 그룹을 하나의 그룹으로 묶어서 변수를 공유하는 방법
    • [그룹명:children]
      그룹명1
      그룹명2
      ...
      [그룹명:vars]
      [속성]
      [그룹명1]
      <host name (managed node)>
      [그룹명2]
      <host name (managed node)>

    • [common:children]
      managed
      public
      private

      ...
      [common:vars]
      ansible_connection=ssh
      ansible_port=22
      ansible_user=ec2-user
      ansible_ssh_private_key_file=/key절대경로
      ansible_python_interpreter=/usr/bin/python3
      [managed]
      12.12.12.12
      13.13.13.13
      [public]
      12.12.12.12
      [private]
      13.13.13.13


TIF

CS부터 시작해서 네트워크, Linux, AWS, 지금 배우는 Ansible 곧 배우게 될 Docker, Kubernetes 운영까지.

뭐 모르는 비전공자 입장에서 볼 때 전체적인 흐름을 익힐 수 있게 커리큘럼이 잘 짜여 있는 것 같다.

배우면서 느끼고 있다.

 

전 직장에서 근무할 때 제품 발주 단계부터 납품까지,

전체적인 흐름을 관리했기에 분야가 달라도 잘할 수 있을 거란 확신이 든다.

 

매일 수업에 집중하고, 반복해서 숙달할 수 있도록 하자.

추가적으로 배워야 할 것들도 차근차근해보자.

 

 

2022. 09. 20 에 작성된 글입니다.

반응형
profile

어쩌다 IT

@jwlish

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!