2016년 8월 19일 금요일

Configuration management, Ansible 을 알아보자 part 1


안녕하세요. kin입니다.

오늘은 configuration management tool 가운데 다크호스로 이미 떠오른 ansible을 한 번 후려쳐 볼까 합니다.

이미 Chef, Puppet, Salt등 다양한 tool들이 많이 사용되어지고 있지만 Ansible 은 흠 일단 쉬워요. Chef, Puppet 은 Ruby 기반이지만 Ansible은 YML(야믈 이라고 발음) 기반이지요. 물론 YML이 static 하기 때문에 dynamic 적으로 사용하려면 JINJA2 (python 기반)을 같이 사용해야 하기 때문에 복잡(?)성이 증가 한다고 생각할 수 있지만 기본적으로 간단합니다.

그럼 Ansible 의 가장 기본적인 특징을 알아볼까요?


  • Ansible 은 Agentless합니다. 
    •  ansible은 기본적으로 SSH(또는 옵션에 따라 ZeroMQ) 기반입니다. 따라서 Puppet 사용시 PKI등의 잡스러운(?) 요소가 필요 없지요. 
  • Ansible은 python 기반입니다.   python 2.4 이상의 버전이 필요합니다. 
  • 풍부한 모듈 지원. 약 200개 이상의 모듈이 out of the box 로 지원됩니다. 
  • Ansible galaxy에서 다양한 role들을 다운로드하여 사용하세요. (chef의 recipe라고 생각하시면 됩니다.) 

Playbook


  • playbook은 ansible의 환경 설정, 배포를 가능케 하는 언어.
  • 각 playbook은 하나 또는 하나 이상의 ‘play’를 둔다. collection of plays
  • play의 목적은 여러 호스트들에 잘 정의된 ‘role’ ‘task’를 매핑하는 역할
  • task는 ansible모듈의 호출을 의미.


  • Playbook files

    • Yml files

      • 1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        - name: Install nodejs required for webservers
          hosts: webservers
          user: kin
          sudo: yes
          roles:
            - nodejs
        - name: Install mongodb  required for dbservers
          hosts: dbservers
          user: kin
          sudo: yes
          roles:
            - mongodb
        cs
      • '야믈’이라 발음
      • 사람이 쉽게 읽을 수 있는’ 데이터 직렬화(serialization) 양식.
      • json은 간결함과 범용성에 초점을 둔다면, yaml은 json의 장점을 포함하고 임의의 고유 데이터 구조에 대한 직렬화 를 지원.
      • yaml은 정적. ansible에서는 이를 동적으로 표현할 수 있는 무엇인가가 필요함.
      • jinja2(http://jinja.pocoo.org/docs/)라는 python 라이브러리를 이용해서 yaml 문법의 단점 을 보완.
      • Site.yml(플레이북 디폴트)
      • block을 가지고 있음.
      • block은 적용할 host와 role을 명시.

    • Hosts file (inventory 파일이라고도 함)

      • 1
        2
        3
        4
        5
        6
        7
        [webservers]
        web01
        web02
        192.168.100.1 set_hostname=web03 
        [dbservers]
        db1
        cs
      • inventory파일은 리모트서버에 대한 meta데이터를 기술하는 파일
      • 파일 포맷은 Standard INI-like 파일
      • ansible에서는inventory파일에는 yml을 적용하지 않았음.
      • 기본파일은 /etc/ansible/hosts을 읽게 하거나, 따로 inventory파일을 만들고 옵션을 주어 동작하게 할 수 있음.
      • [, ]안이 그룹 이름이고, 호스트명(host)은 해당 그룹에 속함
      • 한 줄에 하나의 호스트 선언(IP 또는 hostname)
      • 호스트 선언 뒤에 Host variable을 선언할 수 있음. 
      • 인벤토리 파일에서 호스트네임을 사용하면 /etc/hosts 파일에서 resolvable 하거나 dns lookup을 통해 찾을 수 있어야함.
      • Group varible을 선언할 수 있음
    • Role
      • 1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        .
        ├── README.md
        ├── defaults
        │   └── main.yml
        ├── meta
        │   └── main.yml
        ├── tasks
        │   └── main.yml
        ├── templates
        │   └── nodesource.list.j2
        └── test
            └── integration
                ├── default
                │   ├── default.yml
                │   └── serverspec
                │       └── default_spec.rb
                └── helpers
                    └── serverspec
                        └── spec_helper.rb
        cs
      • Role 들은 서로 dependency를 가질 수 있음. (meta에 정의)
      • Files - 타겟으로 복사 되어져야 하는 파일들(설정 파일 들을 여기에 둔다)
      • Handlers - YML file - notifytriggered 되는 config의 부분이라고 할 수 있음
      • Meta - YML file role dependencies
      • Tasks - 스텝의 리스트로 구성되이 있는 YML 파일 즉 이 스텝들이 타겟 노드에서 명시된 순서대로 실행되어진다.
      • Templates - jinja2 files(YML을 확장하는 동적 템플릿 파일)



      • Task
        • Name 아래 줄을 액션이라고 함. 이 액션이 ansible module을 사용하는 코드임 
        • 1
          2
          3
          4
          5
          6
           - name: Add the Redis PPA
             apt_repository: repo='ppa:rwky/redis' update_cache=yes
           - name: Install Redis from PPA
             apt: pkg=redis-server state=installed
           - name: Start Redis
             service: name=redis state=started
          cs

댓글 없음:

댓글 쓰기