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

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