[구름 k8s] TIL 2-3-2

Peppie·2022년 9월 20일
0

1. Ansible 개요

IaaS - Infrastructure as a Service

클라우드를 통해 가상머신 환경을 온디멘드로 제공

IaC - Infrastructure as Code

인프라를 코드를 사용하여 자동으로 구축

인프라

  • 시스템을 가동하기 위해 전제가 되는 주변 환경 모두
  • 서버와 네트워크 계층을 다루는 것 -> IaC
  • 미들웨어와 어플리케이션 배포 등의 상위 계층을 다루는 것
    -> CaC (Configuration as Code)
  • 넓은 의미에서 IaC는 IaC와 CaC를 모두 포함해서 표현

기존 인프라 관리 방법

  • shell script를 이용한 서버 환경 구성 -> script 방식은 CLI 환경에서 주로 사용
  • shell script를 이용하여 여러개의 서버를 관리할 경우 일관성 유지 쉽지 X
  • shell script를 이용할 때 배포 관리에 대한 문제점

IaC 기능을 수행하는 tools

  • 코드 기반 인프라 관리
  • 일관성 유지
  • 쉬운 배포 관리

Ansible

  • RedHat에서 개발
  • python으로 작성
  • 오픈소스 방식으로 서버의 프로비저닝, SW 배포 등의 자동화를 관리해주는 도구

(참고 1) (참고 2)

Ansible 특징

Agentless

  • 他 자동화 도구(Puppet, Chef)들은 타겟 대상들에 agent 설치 기반 pull 방식으로 동작
  • Ansible은 타겟 대상들에 Agentless 기반의 push 방식으로 동작
    -> 기술적/지리적 제한이 보다 넓은 장점

멱등성 - Idempotency

  • 어떤 연산이 여러번 수행되더라도 결과가 달라지지 않는 성질
  • Ansible은 동일한 모듈을 반복 실행해도 결과가 동일한 멱등성을 일관되게 수행 가능

재사용성 - Reusability

  • 기존 시스템 구성 정보를 재사용하여 손쉽게 인프라 구성 관리 수행

Ansible 구성요소

제어 노드 - control node

  • Ansible을 실행하는 node
  • Ansible 제공 프로그램을 이용하여 매니지드 노드 관리
  • Ansible이 설치된 컴퓨터가 제어 노드가 됨
  • 제어 노드와 매니지드 노드 사이는 SSH를 통해 통신

매니지드 노드 - managed node

  • Ansible로 관리하는 서버를 매니지드 노드 또는 호스트(host), 타겟(target)이라고 함
  • 매니지드 노드에는 Ansible 설치 X

인벤토리 - Inventory

  • 매니지드 노드 목록
  • 인벤토리 파일 == 호스트 파일
  • 인벤토리 파일은 각 매니지드 노드에 대한 IP 주소, 호스트 정보, 변수 등의 정보 저장

모듈 - Module

  • Ansible이 실행하는 코드 단위
  • 미리 만들어진 동작 관련 코드 집합
  • 각 모듈은 데이터베이스 처리, 사용자 관리, 네트워크 장치 관리 등 다양한 용도로 사용
  • 단위 모듈을 호출하거나 playbook에서 여러 모듈을 호출 가능

태스크 - Task

  • Ansible 작업 단위
  • Ad-hoc 명령을 사용하여 단일 작업을 한 번 실행 가능

플레이북 - Playbook

  • 순서가 지정된 태스크 목록
  • 지정된 작업을 해당 순서로 반복적으로 실행 가능
  • 플레이 북에는 변수와 작업 포함 가능
  • YAML로 작성

Ansible 동작 과정

  • Ansible은 인벤토리 파일 내용을 참조하여 관리 대상 매니지드 노드 파악

Ansible을 통한 매니지드 노드 관리 방법

  • 모듈을 통한 매니지드 노드 관리
  • Ad-hoc 명령을 통한 매니지드 노드 관리
  • 태스크 단위로 매니지드 노드 관리
  • 플레이북을 이용한 매니지드 노드 관리

2. Ansible 환경 구축

실습환경 구성

Ansible 제어 노드 구축

Ansible 제어 노드와 Managed node 연결

  • 제어 노드는 Managed node와 연결시 SSH를 통해서 연결
    -> 제어 노드의 SSH Key를 Managed node에 전송해야함
  • but AWS EC2 instance 환경에서는 keypair를 이용하여 연결
    -> 제어 노드에는 Managed node의 keypair를 모두 가지고 있어야 함

제어 노드 구성

Ansible 환경 구성은 제어노드에 구성하고 Managed node에는 특별한 환경 구성 X

  • Ansible 설치
    Ansible은 Linux 환경에 설치 가능

    sudo amazon-linux-extras install ansible2 : Amazon Linux2 ansible 설치 명령

  • Ansible 설치 확인

    ansible --version : Ansible 버전 확인

  • sudo su - : root user로 사용자 전환 명령

  • Ansible 환경 설정 파일

    • /etc/ansible/ansible.cfg : Ansible 환경 설정 파일
      Ansible이 동작할 때마다 참조하는 파일
      Ansible 호스트 키 검사 비활성화 정보를 ansible.cfg 파일에 등록
      host_key_checking=False (처음 설치시에는 주석처리됨)
      • 제어 노드에서 Managed node 접속시 별도 key 확인과정 X, 명령 수행 목적 비활성화 속성 정의

    • /etc/ansible/hosts : 인벤토리 파일
  • Ansible 환경 설정 적용 순서

    지역 설정 (현재 사용자)

    1. ANSIBLE_CONFIG 환경 변수에 지정된 파일
    2. 현재 디렉토리에 있는 ansible.cfg 파일
    3. 사용자 홈 디렉토리에 있는 ansible.cfg 파일

      전역 설정 (모든 사용자)
    4. /etc/ansible/ansible.cfg 파일 (글로벌 전역 파일)
  • Managed node와 연결 확인

    • 제어 노드에서 Managed node와 연결을 하려면 Managed node에 대한 정보 인지 필요
      => 인벤토리 사용
    • /etc/ansible/hosts == 인벤토리, 이 파일에 Managed node에 대한 정보 기술
    • /etc/ansible/hosts 파일은 전역으로 사용하는 인벤토리, 현재 사용자에 대한 인벤토리를 구성하려면 현재 사용자의 작업 디렉토리에 별도의 인벤토리 작성 후 사용 가능

Ad-hoc 명령

  • Ansible은 일반적으로 playbook을 사용하도록 설계
  • 한번만 수행하거나 간단한 명령을 통한 상태 확인 등은 별도의 playbook 사용 X,
    간단한 명령 구문으로 수행 => 이 방식이 Ad-hoc 명령

형식

ansible <호스트명 패턴 (Managed node)> [옵션]

  • all : 호스트명 패턴으로 사용하면 모든 managed node 대상으로 Ad-hoc 명령 실행
  • -m : 모듈명
  • -a <인수 목록> : 모듈 인수
  • -i <인벤토리 파일명> : 인벤토리
    별도의 인벤토리 지정 X -> /etc/ansible/hosts 파일 사용
  • --become : 관리자 권한으로 실행
  • -k : ansible 실행시 암호 확인
  • -K : ansible 실행시 root 권한으로 실행

사용 예

ansible all -m ping -i ./hosts

호스트 패턴 all은 인벤토리의 모든 호스트에 대해 Ad-hoc 명령 적용시 사용하는 호스트 패턴

ansible managed -m ping -i ./hosts

managed 호스트 패턴에 대해 ping 모듈 적용, 인벤토리는 현재 디렉토리의 hosts 사용
(ping 모듈 : Ansible 제어 노드와 Managed node 사이의 통신 연결 상태 확인)

3. Inventory 이해

참고
제어 노드에서 Managed node에 연결하기 위한 정보를 가지고 있는 파일

  • 기본 위치 : /etc/ansible/hosts
    기본 위치의 파일은 default로 적용되는 인벤토리, 관리자 권한으로만 수정 가능
  • 사용자가 원하는 디렉토리에 복사 후 편집하여 사용

    sudo cp /etc/ansible/hosts .
    sudo chown <사용자 ID>:<사용자 그룹> <인벤토리 파일>

    sudo chown ec2-user:ec2-user hosts
  • Ansible 설치 후 기본 인벤토리 내용은 사용법에 대한 주석으로 구성됨

인벤토리 파일 구조

그룹을 지정하지 않는 방식

<hostname (managed node)> [속성]

#host 속성정보
10.0.1.1 ansible_connection=ssh ansible_port=22 ansible_user=ec2-user
ansible_ssh_private_key_file=/home/ec2-user/work-ansible/key.pem

그룹을 지정하는 방식

[그룹명]
<hostname (managed node)> [속성]

[managed]
host1 ansible_host=10.0.1.1 ansible_connection=ssh ansible_port=22 ansible_user=ec2-user
ansible_ssh_private_key_file=/home/ec2-user/work-ansible/key.pem

공통 정보를 변수에 지정하여 공유하는 방식

여러 그룹을 하나의 그룹으로 묶어서 변수를 공유하는 방법

  • [그룹명:children]
    <그룹명>
[common:children]
managed
public
private
webserver
  • [그룹명:vars]
    <hostname (managed node)> [속성]
[managed:vars]
ansible_connection=ssh  //연결 방법
ansible_port=22  //연결 포트 번호
ansible_user=ec2-user  //host(managed node) user id
ansible_ssh_private_key_file=/home/ec2-user/work-ansible/key.pem  //개인키 파일 위치
ansible_python_interpreter=/usr/bin/python3  //host(managed node) python 경고 메세지 출력 방지, python 인터프리터 위치 지정

0개의 댓글