공부/IaC

[Ansible] Ansible 기초 개념과 AWS에서 사용하기(VPC, EC2)

haejang 2020. 11. 8. 16:32
728x90
728x90

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 }}"로 사용할 수 있다

중간에 []까지 쓰인 변수도 있는데, 이는 리스트로 저장되는 경우이다

 

이제 이 파일을 실행해보면

 

 

잘 실행되었다. 한번 콘솔을 열어서 확인해보면

 

vpc, igw, 서브넷
routing table, security group
key
복사된 key
ec2

모두 잘 생성되어있다

 

728x90
728x90