220920 TIL AWS Ansible

sundays·2022년 9월 20일
0
  • IaaS - Infrastructure as a Service

    • cloud를 통해 가상머신 환경을 온디멘드로 제공
  • IaC - Infrastructure as Code
    인프라를 코드를 사용하여 자동으로 구축/관리

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

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

Ansible

  • redhat 에서 python 으로 작성된 자동화 시스템
  • agent가 없는 상태로 동작을 하는 상태로 구성 (agentless)
    • 타 자동화 도구들은 타겟 대상들에 agent 설치 기반 pull 방식으로동작
    • 타겟 대상들에 push 방식으로 동작하여 기술적 지리적 제한이 없음
  • 오픈 소스 방식으로 서버의 프로 비저닝 및 배포 관리 도구
  • 동일한 모듈을 반복 실행해도 결과가 동일한 멱등성을 일관되게 수행
  • 기준 시스템 구성 정보를 재사용하여 인프라 구성 관리 수행

구성요소

  • 제어노드(control node)
    • ansible 을 실행하는 노드
    • 노드 설치 및 관리
    • ansible 이 설치된 computer 가 제어 노드가 된다
    • 매니지드 노드와 ssh 로 통신
  • 매니지드 노드(managed node)
    • ansible 로 관리하는 서버
    • 호스트(host) 또는 target 이라한다
    • ansible을 설치할 수 없다
  • 인벤토리 (Inventory)
    • 매니지드 노드 목록
    • 호스트 파일
    • 매니지드 노드에 대한 IP, 호스트 정보, 변수 정보를 저장
  • 모듈 (module)
    • ansible 실행 단위
    • 미리 만들어진 동작 관련 코드 집합
    • 각 모듈은 데이터베이스 처리, 사용자 관리, 네트워크 장치 관리 등 다양한 용도로 사용
    • 단위 묘듈을 호출 또는 playbook에서 여러 모듈을 호출 할 수 있다.
  • 태스크 (task)
    • ansible 작업 단위
    • ad-hoc 명령으로 단일 작업을 한번 실행
  • 플레이북(playbook)
    • 순서가 지정된 태스크 목록
    • 반복적으로 실행 가능
    • 변수와 작업이 포함 될 수 있다
    • yaml 로 작성

동작 과정

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

  • Ansible을 통한 매니지드 노드 관리 방법
    • 모듈
    • ad-hoc 명령
    • 태스크
    • 플레이 북

Ansible 환경 구축

  • Ansible 제어 노드 - 매니지드 노드 구축

    • 제어 노드는 매니지드 노드와 연결시 ssh 통신
    • 따라서 제어노드의 ssh key를 매니지드 노드에 전송
    • 하지만 ec2 인스턴스에서는 keypair를 이용하여 연결해야 하므로 제어노드에는 매니지드 노드의 keypair를 모두 가지고 있어야 한다
  • 제어노드 구성

    • ansible 환경 구성
      • sudo amazon-linux-extras install ansible2 - Amazon Linux2 ansible 설치 명령
      • ansible --version - ansible 버전 확인
      • /etc/ansible/ansible.cfg - 환경 설정 파일
        • host_key_checking = False
          Control node에서 Managed node에 접속시 별도의 key 확인 과정 없이 명령 수행을 위하여 비활성화 속성 정의
      • /etc/ansible/hosts - 인벤토리 파일
        • Managed node에 대한 정보
        • 전역으로 사용하는 인벤토리 이며 현재 사용자에 대한 인벤토리를 구성하려면 현재 사용자의 작업 디렉토리에 별도의 인벤토리를 작성해서 사용할 수 있다.
  • Ad-hoc 명령

    • 일반적으로 playbook을 사용하지만 간단한 명령 구문으로도 수행 할 수 있는데 이 방식을 ad-hoc이라고 한다
    • ansible <호스트명 패턴( Managed node )> [ 옵션 ]
      -m : 모듈명
      -a < 인수 목록 > : 모듈 인수
      -i <인벤토리 파일명> : 인벤토리
      -k : 암호 확인
      -K : ansible 실행시 root 권한으로 실행

인벤토리

  • 제어 노드에서 매니지드 노드에 연결하기 위한 정보를 가지고 있는 파일
  • /etc/ansible/hosts
  • 사용자가 원하는 디렉토리에 복사한 후 편집하여 사용
    sudo cp /etc/ansible/hosts .
    sudo chown <사용자ID>:<사용자그룹> <인벤토리 파일>

호스트 지정

그룹을 지정하지 않는 방식

<host name( managed node )> [ 속성 ]

10.0.1.97 ansible_connection=ssh ansible_port=22 ansible_user=ec2-user ansible_ssh_private_key_file=/home/ec2-user/work-ansible/gurum-aicore0942-20220906.pem

그룹을 지정하는 방식

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

[managed]
host1 ansible_host=10.0.1.97 ansible_connection=ssh ansible_port=22 ansible_user=ec2-user ansible_ssh_private_key_file=/home/ec2-user/work-ansible/gurum-aicore0942-20220906.pem
  • 사용 예
    • ansible managed -m ping -i ./hosts
      managed 호스트 패턴에 대하여 ping 모듈 적용, 인벤토리는 현재 디렉토리의 hosts 사용

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

[그룹명: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=/home/ec2-user/work-ansible/gurum-aicore0942-20220906.pem -> 개인키 파일 위치
ansible_python_interpreter=/usr/bin/python3 -> host( managed node ) python 경고 메시지를 출력하지 않도록 파이썬 인터프리터 위치 지정
  • 여러 그룹을 하나의 그룹으로 묶어서 변수를 공유하는 방법

    [그룹명:children]
    <그룹명>

    [그룹명:vars]
    <host name( managed node )> [ 속성 ]

[common:children]
managed
public
private
webserver

[common:vars]
ansible_connection=ssh 
ansible_port=22 
ansible_user=ec2-user 
ansible_ssh_private_key_file=/home/ec2-user/work-ansible/webserver.pem
ansible_python_interpreter=/usr/bin/python3

Reference

profile
develop life

0개의 댓글