IaaS = Infrastructure as a Service
클라우드를 통해 가성 머신 환경을 온디멘드로 제공
인프라
시스템을 가동하기 위해 전제가 되는 주변 환경 모두
미들웨어와 어플리케이션 배포등의 상위 걔층을 다루는 것 - CAC( Configuration as Code)
서버와 네트워크 계층을 다룬 것 - IaC
넓은 의미에서 Iac는 Iac 와 CaC를 모두 포함
IaC
기존 인프라 관리 방법
shell script를 이용한 서버 환경 구성
script 방식은 CLI 환경에서 주로 사용
shell script 를 이용하여 여러 개의 서버를 관리할 경우 일관성을 유지하기가 쉽지않다.
shell script를 이요할 때 배포 관리에 대한 문제점이 있다.
Iac 기능을 수행하는 tools 사용시 이점
코드를 기반으로 인프라 관리
일관성 유지 및 배포 관리 수월
파이썬으로 작성, RedHat에서 만듦
오픈소스 방식으로 서버의 프로비저닝, SW 배포 등의 자동화를 관리 해주는 도구
Agentless ->
타 자동화 도구(Puppet,Chef) 들은 타켓대상들에 agent 설치 기반 pull 방식으로 동작
agent 설치 불편 -> 10개의 서버 인프라 관리할 경우 전부 agent 관리
Ansible은 타겟 대상들에 Agentless 기반의 push 방식으로 동작하므로 기술적, 지리적 제한이 보다 넓은 장점
ansible 컨트롤러만 환경을 구성하면 다른 구성하는 곳들에 대해 설치 필요없다
멱등성 - Idempotency
어떤 연산이 여러번 수행 되더라도 결과가 달라지지 않는 성질
Ansible은 동일한 모듈을 반복 실행해도 결과가 동일한 멱등성을 일관되게 수행할 수 있다.
재사용성 - Reusability
기준 시스템 구성정보를 재사용하여 손쉽게 인프라 구성 및 관리 수행
Ansible playbooks가 바로 이런 역할을 함
제어노드 - control node
Ansible을 실행하는 node
Ansible 제공 프로그램을 이용하여 매니지드 노드 관리
Ansible이 설치된 computer가 제어 노드가 된다
제어노드와 매니지드 노드 사이는 SSH를 통해 통신한다.
10개의 가상버신을 관리하고 싶으면 한개의 제어노드를 만들어서 전부 관리 가능
매니지드 노드 - managed node
Ansible로 관리하는 서버를 매니지드 노드 또는 호스트(Host), 타겟이라고 함
인벤토리 - inventory
매니지드 노드 목록
인벤토리 파일은 호스트 파일이라고도 한다.
인벤토리 파일은 각 매니지드 노드에 대한 IP address, 호스트정보, 변수와 같은 정보를 저장
제어노드가 관리하는 매니지드 노드가 누가 있는지 알아햐 하기때문에 인벤토리 필요!
모듈 - module
Ansible이 실행하는 코드 단위
미리 만들어진 동작 관련 코드 집합
각 모듈은 데이터베이스 처리, 사용자 관리, 네트워크 장치 관리등 다양한용도로 사용
단위 모듈을 호출하거나 playbook에서 여러 모듈을 호출할 수 있다.
테스크 - Task
Ansible 작업 단위
Ad-hoc 명령을 사용하여 단일 작업을 한번 실행 할 수 있다
플레이북
순서가 지정된 태스크 목록
지정된 작업을 해당 순서로 반복적으로 실행할 수 있다
플레이 북에는 변수와 작업이 포함 될 수있다.
YAML로 작성
인벤토리 파일 내용을 참조하여 관리 대상 매니지드 노드 파악
모듈을 통한 매니지드 노드관리
Ad-hoc명령을 통한 노드 관리
태스크 단위로 매니지드 노드 관리
플레이북을 이용한 매니지드 노드관리
컨트롤 노드를 통해 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 managed -m ping -i ./hosts -> managed 호스트 패턴에 대하여 ping 모듈 적용, 인벤토리는 현재 디렉토리의 hosts 사용
참고
Control node 에서 Managed node에 연결하기 위한 정보를 가지고 있는 파일
기본 위치
기본 위치의 파일은 default로 적용되는 인벤토리이고 관리자 권한으로만 수정 가능
사용자가 원하는 디렉토리에 복사한 후 편집하여 사용
Ansible 설치 후 기본 인벤토리의 내용은 사용법에 대한 주석으로 구성 되어 있다.
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 경고 메시지를 출력하지 않도록 파이썬 인터프리터 위치 지정