[Ansible] Role 사용법과 변수 파일(vars) 설정, 암호화

728x90

 

* AWS EC2 amazon linux 2에서 진행

 

일단 얘네들을 설치하고 시작하겠다

amazon-linux-extras enable ansible2
yum clean metadata
yum install -y ansible
yum install -y python-pip
yum install -y python3-pip
pip install boto
pip intsall boto3
yum install -y tree

 

2020/11/08 - [공부/Ansible] - [Ansible] Ansible 기초 개념과 AWS에서 사용하기(VPC, EC2)

 

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

1. 앤서블이란? IaC(Infrastructure as Code)를 실천하는 자동화 관리 도구 YAML 형식의 플레이북을 실행시키는 형식으로 자동화 구현 2. 멱등성 앤서블은 멱등성(Idempotency)이란 특징을 가진다 이는 여러

honglab.tistory.com

이 글에선 Ansible Playbook 만드는 실습만 해봤다

하지만 앤서블은 플레이북들의 재사용이 중요하다

 

Ansible Role은 역할들을 정의하고, 이들을 directory별로 분리한다

일단 roles란 디렉토리를 생성한 다음, ansible-galaxy init으로 role을 생성하겠다

아까 설치한 tree 명령어로 디렉토리 구조도 볼 수 있다

mkdir roles
cd roles/
ansible-galaxy init create-ec2

cd ..
tree -C

 

create-ec2는 ec2 만들 실습을 진행할거라 만든 이름이니 다른걸 써도 된다

 

ansible-galaxy init
tree -C

 

여기서 vars 폴더의 main.yml에다가 변수들을 지정해 둔다

그리고 tasks는 playbook에 작성했던 tasks와 같다

files는 각 managed 서버에 배포할 파일의 위치를 작성한다고 한다

 

정리

vars/main.yml에 정의된 변수들은 자동으로 tasks/main.yml에 적용

원래 작성하던 플레이북은 tasks/main.yml에 작성

tasks/main.yml은 create-ec2란 이름으로 project.yml에서 실행

 

defaults는 자주 변하는? 변수들을 선언해둔다고 하고, handlers는 linux service 처리 위해 사용하며, templates는 managed 서버에 배포할 템플릿 파일 위치, meta는 roles에 대한 정보, 호환 버전 등 메타 데이터를 정의한다고 하지만 내 짬(?)에선 사용하기 힘들다

 

참고로 vars나 defaults나 둘중에 하나로 변수파일 통일해서 써도 상관없다고 한다

 

ansinble 동작을 제어하는 설정 파일인 /etc/ansible/ansible.cfg 파일을 현재위치(/root/)로 복사해주겠다

cp /etc/ansible/ansible.cfg ./

 

*참고 - ansible 설정파일 참조 순서*
1. 현재 디렉토리의 ansible.cfg
2. $HOME/.ansible.cfg
3. /etc/ansible/ansible.cfg

 

그리고 이 roles의 task들을 직접 실행하는 project.yml 파일을 생성해주겠다

touch project.yml

 

tree -C로 확인해보면

 

 

1. project.yml

---
- hosts: localhost
  roles:
    - create-ec2

 

2. roles/create-ec2/vars/main.yml

---
# vars file for create-ec2

aws_a_key: 본인 액세스 키
aws_s_key: 본인 시크릿 키

region: ap-northeast-1

az: ap-northeast-1a

ami: ami-0ce107ae7af2e92b5

 

3. roles/create-ec2/tasks/main.yml

---
# tasks file for create-ec2

- name: Create VPC
  ec2_vpc_net:
    aws_access_key: "{{ aws_a_key }}"
    aws_secret_key: "{{ aws_s_key }}"
    name: Test VPC
    cidr_block: 10.1.0.0/16
    region: "{{ region }}"
    state: present
  register: vpc_result

- name: Create Internet Gateway
  ec2_vpc_igw:
    aws_access_key: "{{ aws_a_key }}"
    aws_secret_key: "{{ aws_s_key }}"
    vpc_id: "{{ vpc_result.vpc.id }}"
    region: "{{ region }}"
    state: present
    tags:
      Name: tokyo_igw

- name: Create Public Subnet
  ec2_vpc_subnet:
    aws_access_key: "{{ aws_a_key }}"
    aws_secret_key: "{{ aws_s_key }}"
    cidr: 10.1.0.0/24
    vpc_id: "{{ vpc_result.vpc.id }}"
    region: "{{ region }}"
    az: "{{ az }}"
    map_public: yes
    state: present
  register: subnet_result

- name: Create Routing Table
  ec2_vpc_route_table:
    aws_access_key: "{{ aws_a_key }}"
    aws_secret_key: "{{ aws_s_key }}"
    vpc_id: "{{ vpc_result.vpc.id }}"
    region: "{{ region }}"
    state: present
    subnets: ["{{ subnet_result.subnet.id }}"]

- name: Create Security Group
  ec2_group:
    aws_access_key: "{{ aws_a_key }}"
    aws_secret_key: "{{ aws_s_key }}"
    name: default sg
    vpc_id: "{{ vpc_result.vpc.id }}"
    region: "{{ region }}"
    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:
    aws_access_key: "{{ aws_a_key }}"
    aws_secret_key: "{{ aws_s_key }}"
    name: testkey
    region: "{{ region }}"
  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:
    aws_access_key: "{{ aws_a_key }}"
    aws_secret_key: "{{ aws_s_key }}"
    key_name: testkey
    instance_tags:
      Name: test EC2
    region: "{{ region }}"
    instance_type: t2.micro
    image: "{{ ami }}"
    group: default sg
    wait: yes
    count: 1
    vpc_subnet_id: "{{ subnet_result.subnet.id }}"
    assign_public_ip: yes

이렇게 해보고 ansible-playbook project.yml로 실행해보자

 

 

잘 실행된다

콘솔로 확인해보면

 

test VPC, EC2

 

도쿄 리전에 VPC와 EC2가 잘 만들어진걸 확인할 수 있다 (그 외의 것들도 다 만들어져있음)

 

 

+) task 여러 개인 경우

ansible-galaxy init roles/create-db

 

tree는 이런식

 

그리고 project.yml을 수정해 두 task를 동시에 실행할 수 있다

 

projcet.yml

 

 

+) 변수파일 잠그기

변수파일엔 아무래도 키들이 저장되어 있으므로 잠궈주는게 좋다

ansible-vault encrypt roles/create-ec2/vars/main.yml

 

 

이 다음에 그냥 project.yml을 실행하면 에러가 뜬다

 

 

아래 옵션으로 패스워드 입력 후 앤서블 실행이 가능하다

ansible-playbook --ask-vault-pass project.yml

 

 

 

 

728x90