goorm-26일차

박경현·2022년 9월 20일
0

IaC 개요

IaaS = Infrastructure as a Service	 
	클라우드를 통해 가성 머신 환경을 온디멘드로 제공

인프라
	시스템을 가동하기 위해 전제가 되는 주변 환경 모두

	미들웨어와 어플리케이션 배포등의 상위 걔층을 다루는 것 - CAC( Configuration as Code)
	서버와 네트워크 계층을 다룬 것 - IaC
	넓은 의미에서 Iac는 Iac 와 CaC를 모두 포함

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

	Iac 기능을 수행하는 tools 사용시 이점
		코드를 기반으로 인프라 관리
		일관성 유지 및 배포 관리 수월

Ansible

파이썬으로 작성, RedHat에서 만듦

오픈소스 방식으로 서버의 프로비저닝, SW 배포 등의 자동화를 관리 해주는 도구

Ansible의 특징

Agentless -> 
		타 자동화 도구(Puppet,Chef) 들은 타켓대상들에 agent 설치 기반 pull 방식으로 동작
		agent 설치 불편 -> 10개의 서버 인프라 관리할 경우 전부 agent 관리
		
		Ansible은 타겟 대상들에 Agentless 기반의 push 방식으로 동작하므로 기술적, 지리적 제한이 보다 넓은 장점
		ansible 컨트롤러만 환경을 구성하면 다른 구성하는 곳들에 대해 설치 필요없다

멱등성 - Idempotency
		 어떤 연산이 여러번 수행 되더라도 결과가 달라지지 않는 성질

		Ansible은 동일한 모듈을 반복 실행해도 결과가 동일한 멱등성을 일관되게 수행할 수 있다.
	
재사용성 - Reusability
		기준 시스템 구성정보를 재사용하여 손쉽게 인프라 구성 및 관리 수행
		Ansible playbooks가 바로 이런 역할을 함

Ansible 구성 요소

제어노드 - control node

Ansible을 실행하는 node
Ansible 제공 프로그램을 이용하여 매니지드 노드 관리
Ansible이 설치된 computer가 제어 노드가 된다

제어노드와 매니지드 노드 사이는 SSH를 통해 통신한다.
10개의 가상버신을 관리하고 싶으면 한개의 제어노드를 만들어서 전부 관리 가능

매니지드 노드 - managed node

Ansible로 관리하는 서버를 매니지드 노드 또는 호스트(Host), 타겟이라고 함

인벤토리 - inventory

매니지드 노드 목록
인벤토리 파일은 호스트 파일이라고도 한다.
인벤토리 파일은 각 매니지드 노드에 대한 IP address, 호스트정보, 변수와 같은 정보를 저장

제어노드가 관리하는 매니지드 노드가 누가 있는지 알아햐 하기때문에 인벤토리 필요!

모듈 - module

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

테스크 - Task

Ansible 작업 단위
Ad-hoc 명령을 사용하여 단일 작업을 한번 실행 할 수 있다

플레이북

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

Ansible 동작과정

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

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

Ansible 환경 구축

	컨트롤 노드를 통해 3개의 매니지드 노드를 관리해보자!

	1. VPC 확인하기
	2. NAT 게이트 웨이 만들기 (EIP가 있어야한다!)->( private 서브넷이 인터넷을 사용하기 위해 사용하는게 NAT Gateway의 목적임 )
	3. 프라이빗 서브넷이 퍼블릭 NAT과 연결해야 외부와 통신이 가능하다 
		 라우팅 테이블에 들어가서 -> 라우팅에 NAT Gateway를 연결하기!
	4. 이제 EC2 인스턴스에 가서 노드들을 만들기

	컨트롤 노드 -> ssh만 열려있으면 됨 -> 그거로만 컨트롤하니까
	
	매니지드 노드 -> 서비스를 제공할 목적이니까 웹도 열려있어야한다.
	

	VSC로 컨트롤 노드 들어가기!

	mkdir work-ansible 해서 만들어주고 여기에 .pem 넣기!
	sudo amazon-linux-extras install ansible2

	Ansible 설치 확인 => ansible —version

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

Ansible 환경 설정 파일

	/etc/ansible/ansible.cfg - Ansible 환경 설정 파일
	Ansible 호스트 키 검사  속성을 비활성화 설정
	처음 설치시에는 ansible.cfg 파일에 주석( comment ) 처리 되어 있다.

host_key_checking = False

Control node에서 Managed node에 접속시 별도의 key 확인 과정 없이 명령 수행을 위하여 비활성화

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 파일은 전역으로 사용하는 인벤토리 이며

    • 현재 사용자에 대한 인벤토리를 구성하려면 현재 사용자의 작업 디렉토리에 별도의 인벤토리를 작성해서 사용할 수 있다.

      ansible all -m ping 으로 인벤토리 비어있는지 확인가능
Ansible 제어 노드 구축
	제어노드는 매니지드 노드와 연결시 SSH를 통해 연결!

	따라서 제어 노드의 SSH Key를 Managed node에 전송해야한다

	하지만 AWS EC2 instance 환경에서는 keypair를 이용하여 연결함으로 
	Control node에는 매니지드 키페어를 모두 가지고 있어야한다
		-> 그냥 전부 한개로 통일 하는게 편함

	 
  • Ad-hoc 명령

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

    • ping 모듈 - Ansible Control node와 Manage node 사이의 통신 연결 상태 확인 
  1. Inventory 이해
  • 참고 

  • Control node 에서 Managed node에 연결하기 위한 정보를 가지고 있는 파일

  • 기본 위치

    • /etc/ansible/hosts
  • 기본 위치의 파일은 default로 적용되는 인벤토리이고 관리자 권한으로만 수정 가능

  • 사용자가 원하는 디렉토리에 복사한 후 편집하여 사용

    • sudo cp /etc/ansible/hosts .
    • sudo chown <사용자ID>:<사용자그룹> <인벤토리 파일>
  • Ansible 설치 후 기본 인벤토리의 내용은 사용법에 대한 주석으로 구성 되어 있다.

  • 인벤토리 내용
    • 그룹을 지정하지 않는 방식
      • <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

  • 공통 정보를 변수에 저장하여 공유하는 방식
    * [그룹명: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 경고 메시지를 출력하지 않도록 파이썬 인터프리터 위치 지정

profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글