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 | 
					
				
					
				
					
				
					
				
					
				
					
				
										
									
										
									
										
									
										
									
	
댓글