1. 앤서블이란?
IaC(Infrastructure as Code)를 실천하는 자동화 관리 도구
YAML 형식의 플레이북을 실행시키는 형식으로 자동화 구현
2. 멱등성
앤서블은 멱등성(Idempotency)이란 특징을 가진다
이는 여러 번 적용해도 결과가 바뀌지 않으며, 수정된 부분이 있다면 그 부분만 새롭게 반영되는 특징이다
3. Playbook
YAML 형식으로 작성된 각각의 Playbook들은 하나 이상의 Play를 가지며, 각각의 Play는 하나 이상의 task(앤서블 모듈)을 실행한다
4. 앤서블 설치 조건
- 리눅스/유닉스 계열의 OS 환경
- 파이썬(일반적인 리눅스 배포판에는 기본으로 내장)
5. 앤서블 설치(Amazon Linux 2에서 진행)
* AWS EC2 Amazon Linux 2에서 진행
amazon-linux-extras enable ansible2
yum clean metadata
yum install ansible -y
6. AWS 모듈 사용 준비 (앤서블 사용)
AWS 모듈을 사용하려면 pip과 boto를 설치해야 한다
이를 앤서블로 진행해 보겠다
vi install.yml 로 편집기를 열어 다음을 작성해준다
---
- hosts: localhost
become: yes
tasks:
- name: install pip
yum:
name:
- python-pip
- python3-pip
state: latest
- name: install boto
pip:
name:
- boto
- boto3
---는 YAML 형식임을 선언하는 것(생략 가능)
hosts: localhost는 현재 호스트에서 이 플레이북을 실행한다는 뜻이다
become: yes는 sudo 권한을 부여해준다(yes 대신 true로 써도 됨)
tasks엔 각각의 task들을 기술할 수 있고, 각각의 task는 name으로 이름을 지정해준다(로그에 표시되는 이름)
첫번째 task는 yum으로 python-pip과 python3-pip을 가장 최신 버전으로 설치하는 것이고, 두번째 task는 pip으로 boto와 boto3를 설치하는 것이다
그리고 띄어쓰기 꼭 잘 맞춰야 한다. YAML은 띄어쓰기가 생명
install.yml을 저장하고 나온 뒤
ansible-playbook install.yml
이렇게 실행해주면
각각의 task가 잘 진행된걸 확인할 수 있다
7. AWS 모듈 사용 - VPC 구성, EC2 생성
먼저 aws console의 내 보안 자격 증명에서 액세스 키와 비밀 액세스 키를 받아 복사해두자
그리고 export로 키들을 저장해두자
export AWS_ACCESS_KEY_ID=본인 액세스 키
export AWS_SECRET_ACCESS_KEY=본인 시크릿 키
나중에 다시 접속해도 계속 쓰고 싶다면 vi ~/.bashrc를 열어 저 두줄을 맨 밑에 추가해주면 된다
이제 vi createVPC_EC2.yml로 도쿄 리전에다가 VPC를 구성해 EC2를 만들어보겠다
---
- hosts: localhost
become: yes
tasks:
- name: Create VPC
ec2_vpc_net:
name: Test VPC
cidr_block: 10.1.0.0/16
region: ap-northeast-1
state: present
register: vpc_result
- name: Create Internet Gateway
ec2_vpc_igw:
vpc_id: "{{ vpc_result.vpc.id }}"
region: ap-northeast-1
state: present
tags:
Name: tokyo_igw
- name: Create Public Subnet
ec2_vpc_subnet:
cidr: 10.1.0.0/24
vpc_id: "{{ vpc_result.vpc.id }}"
region: ap-northeast-1
az: ap-northeast-1a
map_public: yes
state: present
register: subnet_result
- name: Create Routing Table
ec2_vpc_route_table:
vpc_id: "{{ vpc_result.vpc.id }}"
region: ap-northeast-1
state: present
subnets: ["{{ subnet_result.subnet.id }}"]
- name: Create Security Group
ec2_group:
name: default sg
vpc_id: "{{ vpc_result.vpc.id }}"
region: ap-northeast-1
state: present
description: allow 22, 80
tags:
Name: default sg
rules:
- proto: tcp
ports:
- 22
cidr_ip: 0.0.0.0/0
- proto: tcp
ports:
- 80
cidr_ip: 0.0.0.0/0
- name: Create Tokyo EC2 key
ec2_key:
name: testkey
region: ap-northeast-1
register: key_result
- name: Save Private Key
copy: content="{{ key_result.key.private_key }}" dest=/root/.ssh/testkey.pem mode=0400
when: key_result.changed
- name: Create EC2
ec2:
key_name: testkey
instance_tags:
Name: test EC2
region: ap-northeast-1
instance_type: t2.micro
image: ami-0ce107ae7af2e92b5
group: default sg
wait: yes
count: 1
vpc_subnet_id: "{{ subnet_result.subnet.id }}"
assign_public_ip: yes
길어서 정신없겠지만 하나하나 뜯어보면 별거없다
각각의 task별로 쓰이는 모듈들(ec2_vpc_net, ec2_vpc_igw 등등)을 검색해보면 거기에 쓰이는 옵션들과 설명이 쓰인 ansible 도큐먼트들이 나올 것이니 직접 찾아보자
전체적인 설명을 해보자면 도쿄리전(ap-northeast-1)에다가 10.1.0.0/16짜리 VPC를 하나 만들고, 거기에 연결되는 인터넷 게이트웨이를 만들었으며, 10.1.0.0/24짜리 퍼블릭 서브넷과 그와 연결된 라우팅 테이블도 만들었다
또한 포트 22와 80을 허용하는 보안 그룹을 만들고, EC2용 키를 하나 만들었으며, 그 키를 현재 localhost의 원하는 위치에 권한 400으로 복사해서 저장해주었다
마지막으로 지금까지 만든것들을 이용한 EC2를 하나 만들었으며 image는 리전별로 다르니 자신이 원하는 리전의 ami를 직접 찾아내 복사해서 사용하자
register를 좀 설명해보자면 task를 수행할 시 해당 모듈(ex: ec2_vpc_net)이 실행되면서 나오는 결과물(ex: Test VPC)을 원하는 이름(ex: vpc_result)로 저장해둘 수 있다
각각의 결과값들에서 나올 수 있는 변수들은 모듈들의 도큐먼트를 참조하기로 하고, vpc_result만 좀 설명해보자면 vpc_result는 결국 Test VPC 자체를 뜻하고, 이 VPC의 vpc id를 원한다면 "{{ result_vpc.vpc.id }}"로 사용할 수 있다
중간에 []까지 쓰인 변수도 있는데, 이는 리스트로 저장되는 경우이다
이제 이 파일을 실행해보면
잘 실행되었다. 한번 콘솔을 열어서 확인해보면
모두 잘 생성되어있다
끝
'공부 > IaC' 카테고리의 다른 글
[AWS CloudFormation] #0 실습 전 개념 정리 (0) | 2021.01.04 |
---|---|
[Ansible] Role 사용법과 변수 파일(vars) 설정, 암호화 (1) | 2020.11.11 |
[Ansible] Ansible로 Git 레포지토리 연결하기 (0) | 2020.11.08 |
[Boto3] 윈도우에서 Python으로 AWS 리소스 프로비저닝하기 (0) | 2020.10.22 |
[Boto3] Linux에서 Python으로 AWS 리소스 프로비저닝하기 (IAM, Key Pair, VPC, EC2) (1) | 2020.08.18 |
댓글