/ azure

Ansible로 Azure 관리하기 #1 - Ansible 기초

Ansible은 오픈소스 IT 자동화 툴이다. 커맨드 라인 기반으로 수십, 수백대의 서버를 관리할 수 있다. Ansible의 기본 구조와 개념을 알아보고 Azure의 VM들을 Ansible로 만들고 관리하는 방법에 대해서 살펴보자.

Ansible로 Azure 관리하기 #2 - Provision

Azure에 시스템이 구축되면 ...

Azure에 일단 시스템이 구축되어 돌아가기 시작하면 '모니터링'과 '시스템 운영 자동화' 두 가지가 생각난다. 그 중에 운영 자동화를 Ansible을 이용해서 도움을 받을 수 있다. 물론 Azure 에서는 이미 Azure CLI, Azure PowerShell, ARM Template, Azure REST API와 SDK를 제공하고 있기 때문에 필요하면 bash, powershell, c#, node 등 여러가지 언어로 툴을 만들어 운영을 자동화 할 수 있다.

하지만 이렇게 시작하면 필요한 많은 툴을 직접 만들어야 하고 디버깅 해야하기 때문에 시간과 비용이 든다. 이미 누군가 필요한 것들을 만들어 놨다면 그걸 쓰는게 좋은 방법이다. Ansible, Terraform, Chef, SaltStack등 이미 오픈소스 프로젝트가 진행되고 있다. 이 중에서 가장 적합한 툴을 선택해서 구축하면 된다. Ansible은 운영을 할 팀이 Linux, Bash, CLI 등에 익숙하다면 추천할 만 하다.

Ansible의 특징

오픈소스 / 에이전트 설치 없음 / 데이터베이스 필요 없음 / 추가 SW 설치 없음

시스템 요구사항

system-requirement

Ansible 컨트롤 서버는 Linux 기반으로 Python이 설치되어 있어야 한다. 관리의 대상이 되는 리모트 서버는 Linux인 경우 SSH로 Windows의 경우 WinRM으로 컨트롤 하기 때문에 에이전트를 설치하지 않아도 되는 장점이 있다.

또한 Ansible 컨트롤 서버와 리모트 서버는 서로 통신이 가능한 네트워크에 있어야 한다. Azure의 경우 같은 가상네트워크에 있거나 다른 가상네트워크라면 VNet Peering 등의 방법으로 연결시켜줘야 한다.

Ansible의 구조

ansible-arch

Ansible의 구조는 그림과 같은데 3가지 용어를 알아야 한다.

인벤토리(Inventory)

인벤토리는 관리의 대상이 되는 시스템의 리스트를 말한다. 보통 텍스트 파일(ini 또는 yaml)파일에 시스템의 IP 또는 hostname을 쭉 적어놓는데 시스템들을 그룹핑해서 선택할 수 있도록 구조를 만들어준다.

[webservers]
foo.example.com
bar.example.com

[dbservers]
one.example.com
two.example.com
three.example.com
all:
  hosts:
    mail.example.com:
  children:
    webservers:
      hosts:
        foo.example.com:
        bar.example.com:
    dbservers:
      hosts:
        one.example.com:
        two.example.com:
        three.example.com:

모듈(Module)

미리 구현되어 있는 모듈을 이용해서 필요한 작업을 만들 수 있다. 가장 간단한 ping 모듈은 리모트 서버에 접속해서 연결 결과를 알려주는 모듈이다.

플레이북(Playbook)

플레이북은 Ansible이 배포(deployment), 설정(configuration), 통합관리(orchestration)를 표현하는 언어다. YAML 파일로 표현하며 모듈을 사용해서 여러개의 태스크를 순서에 의해 수행할 수 있도록 작성한다.

--
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum:
      name: httpd
      state: latest
  - name: write the apache config file
    template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running (and enable it at boot)
    service:
      name: httpd
      state: started
      enabled: yes

예제에서 보면 hosts: webservers 는 inventory 파일에 기술되어 있는 webservers 호스트들에게 yum 이라는 모듈을 이용하여 httpd 를 설치하고 template 이라는 모듈로 httpd.conf를 만들어서 복사하고 Service라는 모듈로 apache를 시작한다.

모듈, 인벤토리, 플레이북에 기술된 내용이 Python으로 만들어진 Ansible을 통해 해석되어 Linux 는 SSH로, Windows는 WinRM으로 명령을 전송하여 리모트의 서버에 작업을 수행하게 되어 있다.

그 외에 Playbook 작성을 좀 더 구조적으로 할 수 있도록 Roles, Vars 라는 개념도 알고 있으면 좋은데 Ansible 시작하기 문서, 비디오 등을 활용해서 스터디 하면 된다.

설치

Linux 배포판 마다 설치하는 방법이 설치 가이드 문서에 기술되어 있다.

Azure를 위한 내용

Azure를 위한 추가적인 내용은 Microsoft Azure 가이드 문서에 나와 있다.

Azure에 VM을 만들고 관리를 하기 위해서는 인증을 해야 하는데 Azure Service Priciple을 통해서 할 수 있다. 포털을 사용하여 리소스에 액세스할 수 있는 Azure Active Directory 응용 프로그램 및 서비스 주체 만들기 문서를 따라하면 Azure 포탈에서 만들 수 있다.

Service Principle을 만들었다면 4가지 값을 복사하여 $HOME/.azure/credentials 파일을 만들어서 저장한다.

[default]
subscription_id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
client_id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
secret=xxxxxxxxxxxxxxxxx
tenant=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

이렇게 준비가 되면 azure_rm_virtualnetwork, azure_rm_storageaccount 등의 모듈을 이용하여 VM, 스토리지 등 Azure에 필요한 리소스를 만들 수 있다.

VM을 만드는 플레이북을 예로 들면 아래와 같다.

- name: Create virtual machine
  azure_rm_virtualmachine:
    resource_group: Testing
    name: testvm001
    vm_size: Standard_D1
    storage_account: testaccount001
    storage_container: testvm001
    storage_blob: testvm001.vhd
    admin_username: admin
    admin_password: Password!
    network_interfaces: testnic001
    image:
      offer: CentOS
      publisher: OpenLogic
      sku: '7.1'
      version: latest

이렇게 Azure에 Linux VM을 만들고 아파치를 설치하고 설정파일을 복사해서 웹서버 용 VM을 Ansible을 이용하여 만들 수 있다.

다이나믹 인벤토리(Dynamic Inventory)

Azure와 같은 Cloud 환경에서는 VM들이 쉽게 만들어지고 사라진다. 이런 환경에서는 인벤토리를 파일로 가지고 있으면 변경될 때마다 매번 파일을 수정해줘야 하는데 좋은 방법이 아니다. Ansible은 이런 상황을 위해서 다이나믹 인벤토리라는 개념을 가지고 있다. Azure도 다이나믹 인벤토리가 있는데 azure_rm.py 라는 파이썬 코드가 Azure API를 통해서 호스트 정보를 조회해서 인벤토리로 활용하는 방법이다.

자세한 내용이 Azure 문서에 기술되어 있다. 전체 VM을 가져오거나 특정 지역, 리소스 그룹, 태그를 이용해서 VM의 리스트를 조회할 수 있고 다시 플레이북에서 필터링 해서 원하는 VM 리스트에 태스크를 수행 할 수 있도록 구성할 수 있다.

다이나믹 인벤토리를 사용하는 부분이 문서화가 덜 되어 있고 Azure와 관련해서 많이 사용하기 때문에 2편 Provision에서 좀 더 자세한 사용법을 알아보자.

자료

http://ansible.com/get-started

Pluralsight Lectures(유료): Hands-on Ansible Getting Started with Ansible on Windows

Ansible docs:Microsoft Azure Guide

github sample code: https://github.com/ilseokoh/ansible-azure

Ansible ‘azure_rm_deployment’ Module

Azure Dynamic Inventory azure_rm.py