2020. 3. 9. 10:26ㆍIT/SysOps
Ansible은 프로비저닝, 애플리케이션 구성 관리를 쉽게 자동화할 수 있는 플랫폼이다. 원격에서 에이전트 없이 SSH를 통하여 사용자가 정의한 스크립트를 배포할 수 있다.
Ansible은 크게 Ansible Controller와 Ansible Target으로 구성된다. Controller는 Target에 대해 어떤 구성을 명령할지 Task를 정의한다. YAML 형식으로 구성된 Playbook을 만들어서 여러개의 Task를 수행할 수 있다.
더 자세한 Ansible의 구성요소는 다음과 같다.
-
Inventory : 관리할 대상의 서버 리스트
-
Modules : host에 action을 수행하는 스크립트
-
Playbook : 변수 및 task를 host에 수행하기 위한 yaml 파일
-
Plug-in : 확장 기능(email, logging) 제공
-
Custom modules : 사용자가 작성한 모듈
본문에서는 Ansible을 설치하여 구성하고, AWS 계정과 연동하여 자체 인프라를 프로비저닝한다. 또한 Ansible을 이용하여 원격에서 원하는 인스턴스에 웹서버와 특정 에이전트를 설치한다.
1. 사전 준비
1.1 Ansible 설치
다음과 같이 Amazon Linux 2에서 필요한 python, boto, ansible2를 설치한다. Amazon Linux의 리포지토리에 연결한다.
sudo yum -y install python-pip
sudo pip install --upgrade pip
sudo pip install boto
sudo amazon-linux-extras install ansible2
지정한 Ansible 버전이 정상적으로 설치되어 있는지 확인한다.
ansible --version
1.2 프로비저닝 테스트
Ansible을 이용하여 간단한 AWS EC2 인스턴스 프로비저닝을 테스트한다. 새로운 SSH Key를 생성하여 EC2 인스턴스와 연결할 준비를 한다.
ssh-keygen -t rsa -b 4096 -f ~/.ssh/key이름
프로비저닝할 디렉터리를 생성하고, 프로비저닝할 yml 파일을 생성한다.
mkdir -p AWS_Ansible/group_vars/all/
cd AWS_Ansible
touch playbook.yml
ansible-vault 파일을 생성한다. AWS 액세스를 입력할 파일이다.
ansible-vault create group_vars/all/pass.yml
EC2에 접근할 수 있는 계정의 액세스 정보를 입력한다. 해당 액세스 정보는 Playbook이 실행될 때, 참고된다.
ansible-vault edit group_vars/all/pass.yml
Vault password:
ec2_access_key:
ec2_secret_key:
작성한 playbook 파일을 실행한다.
ansible-playbook playbook.yml --vault-password-file vault.pass
접속한 계정의 인스턴스를 프로비저닝 할 수 있다. 아래는 현재 실행되고 있는 EC2를 프로비저닝한 것이다.
2. Ansible을 이용한 Web server 설치
2.1 Ansible Master-Slave 설정
Ansible의 장점 중 하나는 아래와 같이 하나의 Master(Ansible 설치 서버)가 SSH 기반으로 다수의 Host를 구성 및 관리할 수 있다는 점이다.
다음은 Ansible 설정에 필요한 파일이다.
-
/etc/ansible/ansible.cfg : Ansible 실행에 관한 설정 파일이다.
-
/etc/ansible/hosts : Ansible에 연결하기 위한 기본 파일이다. 추후 변경할 수 있고, 인벤토리 파일이라고 한다.
Master 서버에 Ansible을 설치 및 구성하고, Master에서 Host(Slave)로 접근할 수 있도록 설정한다.
우선 hosts 파일을 정의한다. 이 파일은 인스턴스(그룹)을 제어 및 연결하기 위함이다.
vi /etc/ansible/hosts
[production]
slave1 ansible_host= ansible_user=ec2-user ansible_ssh_private_key_file=/home/ec2-user/joohyun-cicd-test-server-keypair.pem
slave1은 machine-name이다. 사용자가 임의로 설정하여 관리할 수 있다. ansible_host과 ansible_user는 연결하려는 IP와 사용자 계정이다.
ansible_ssh_private_key_file은 pem 키 파일이 있는 경로로 작성한다.
다음 명령어를 통하여 인스턴스와 연결이 가능한지 확인한다.
$ ansible -m ping all
다음과 같이 SUCCESS로 Slave1으로 지정한 인스턴스와 연결됨을 확인한다. Master-Slave 설정이 완료된 것이다.
2.2 Apache 설치
Ansible-Playbook을 사용하여 Apache를 설치한다. 새롭게 'apache.yml'파일을 생성하여 다음과 같이 작성한다.
$vi apache.yml
---
- hosts: slave1
become: yes
tasks:
- name: Install apache packages
yum:
name: httpd
state: present
- name: ensure httpd is running
service:
name: httpd
state: started
생성한 Playbook을 다음 명령어로 실행한다.
$ ansible-playbook apache.yml
Apache가 Inventory 파일에서 인스턴스에 성공적으로 설치됨을 확인한다.
해당 인스턴스 IP로 접속하면 Apache가 정상적으로 동작하는 것을 확인할 수 있다.
3. Ansible을 이용한 CodeDeploy Agent 설치
3.1 Ansible Master-Slave 설정
Hosts 파일을 정의한다. 이 파일은 인스턴스(그룹)을 제어 및 연결하기 위함이다.
위에서와 같이 machine-name을 지정한다. ansible_host와 ansible_user는 연결하려는 IP와 사용자 계정을 작성한다. ansible_ssh_private_key_file은 pem 키 파일이 있는 경로로 작성한다.
vi /etc/ansible/hosts
[production]
slave1 ansible_host= ansible_user=ec2-user ansible_ssh_private_key_file=/home/ec2-user/joohyun-cicd-test-server-keypair.pem
다음 명령어를 통하여 인스턴스와 연결이 가능한지 확인한다.
$ ansible -m ping all
다음과 같이 SUCCESS로 Slave1으로 지정한 인스턴스와 연결됨을 확인한다. Master-Slave 설정이 완료된 것이다.
3.2 CodeDeploy Agent 설치
Ansible-Playbook을 사용하여 Codedeploy agent를 설치한다. 새롭게 'codedeploy.yml'파일을 생성하여 다음과 같이 작성한다.
$vi codedeploy.yml
---
- hosts: slave1
become: yes
tasks:
- name: Install Packages
become: true
yum:
state: latest
name: ruby
update_cache: yes
- name: Download CodeDeploy Agent
get_url:
url: "https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install"
dest: /tmp/codedeploy-install
mode: 0755
- name: Codedeploy Install
become: true
shell: AWS_REGION=ap-northeast-2 /tmp/codedeploy-install auto
생성한 Playbook을 다음 명령어로 실행한다.
$ ansible-playbook codedeploy.yml
Codedeploy agent가 인스턴스에 성공적으로 설치됨을 확인한다. 각 task가 성공적으로 수행됨을 확인한다.
마지막으로, Slave1으로 지정한 인스턴스에서 Codedeploy agent가 동작함을 확인한다.
이렇게 Master-Slave 관계를 설정하고, Playbook을 작성하여 특정 인스턴스에 설치를 하였다.
본문에서는 Hosts 파일에 하나의 인스턴스로 작성하였지만, 다수의 인스턴스 및 그룹으로 작성하여 사용할 수 있다.
'IT > SysOps' 카테고리의 다른 글
Terraform으로 AWS 인프라 구축 (0) | 2020.02.17 |
---|