Imgur

Ansible

Ansible은 오픈 소스 소프트웨어 프로비저닝, 구성 관리, 애플리케이션 전개 도구이다. 수많은 유닉스 계열 시스템에서 실행되며 유닉스 계열 운영 체제 및 마이크로소프트 윈도우의 구성이 가능하다.
시스템 구성을 기술하기 위해 자체 선언형 언어를 포함하고 있다. 위키백과

  • 테스트 환경을 구축(다양한 OS)

  • python으로 개발 되었고 YAML 언어를 통해 정의할 수 있고, JSON 방식으로 통신

  • OPEN Source

기본개념

환경설정, 배포를 가능케 하는 언어. 리모트 서버에 접속해서 무언가를 실행시키는 정책을 기술한다. YAML 문법으로 정책이 기술되어 고급 단계에서 로드밸런서를 모니터링하는 복잡한 환경에서도 사용할 수 있도록 한다.

playbook은 하나 또는 하나 이상의 play를 두게 되고, play의 목적은 여러 호스트들을 잘 정의 된 ROLETASK를 매핑하는 역할을 합니다. TASKAnsible모듈의 호출을 의미한다.
ROLE을 더 편하게 관리하기 위해서 YAML파일로 정의해서 사용할 수 있다. 또한 host inventory 파일에 정의한 서버 그룹별로 각각 나누너 provision 할 수 있도록 할 수 있다.

장점

  • 빠른 SSH 통신, 빠른 Provision을 이용가능

  • agent daemon을 사용하지 않음

  • 자동 배포 환경이 구성 쉬움

  • 멱등성
    여러 번 적용해도 결과 변동 없음
    바뀌는 것이 없으면 당연히 배포되어도 변경 없음
    바뀌는 부분이 있으면 그 부분만 반영
    shell, command, file module은 보장 안됨

  • playbook

  • ad-hoc 지원

  • 병렬 Provisioning 지원

단점

  • 시스템 초기 설치 수행은 불가능

  • 시스템 모니터링은 지원 안함

  • 시스템 변경사항 초적하지 않음

할수있는 것

앤서블에는 크게 3가지 요소가 있다.
inventory, playbook, module이 그것이다.
이는 각각 (1) 어디서, (2) 무엇을, (3) 어떻게 수행할지를 정의한다. (엄밀히 말하면 모듈이 플레이북에서 사용되지만, 이해를 위해 구분해 설명한다)

inventory

remote server에 대한 meta 데이터를 기술하는 파일.
인벤터리는 앤서블에 의해 제어되어 Infrastructure as a Code의 대상이 될 서버들의 목록을 정의하는 파일 일반적으로 hosts.ini 파일에 정의해 사용하는 듯 하며, 위 예시에서 작성했던 hosts.ini 파일이 바로 그것이다.
인벤터리에는 여러 서버들의 접속 정보 (SSH 접근 IP, 포트, 리눅스 사용자) 등을 정의.
기본 파일은 /etc/ansible/hosts를 읽게 하거나, 따로 inventory파일을 만들고 옵션을 주어 동작하게 할 수 있다. 만약 고정 ip를 가지고 있고, ghost 파일 안에 들어가 있지 않는 서버가 있다면 설정 파일을 만들 수 있고 테스트 환경을 만들 때 유용하다.

대충 아래와 같은 파일로 구성이 된다.

centos1 ansible_host=172.16.49.133 ansible_user=root
centos2 ansible_host=172.16.49.134 ansible_user=root
zabbix ansible_host=172.16.49.135 ansible_user=root

[server]
centos1
centos2
zabbix

PLAYBOOK

설정을 관리가호 다수의 머신에 대한 배포 시스템에 대한 기본적인 단위. 복잡한 형태의 배포에 매우 적합하다. 설정을 정의할 수 있으며 특정머신의 집합을 오가며 다른 작업을 수행하도록 수동으로 작업 순서를 설정하는 것도 가능하다. 이 때의 작업은 동기 또는 비동기로 수행할 수 이다. /usr/bin/ansible명령을 통해서 AD-HOC 테스크를 실행하는 것에 반해 PLAYBOOK은 소스 컨트롤을 통해 보관하거나 사용자의 설정을 내보내거나 원격 시스템을 구성,보장디는데 더욱 적합합니다.

Module

이미 정의해 놓은 모듈들을 통해서 다중명령어를 보내줄 수 있다. 예를 들어 yum이라는 모듈을 통해서 설치작업을 요청할 수 있으며, shell모듈을 통해서 커맨드 입력을 보낼 수 있다.

ansible -l #모든 module 목록 조회

ad-hoc

adhoc이라는 의미는 임시적 수행을 말한다.
ansible의 playbook을 작성하는 것이 아니라 임시적으로 또는 특별하게 어떤 작업을 수행하기 위해서 사용할 수 있는 실행방법이라고 할 수 있다.

Ansible 시작하기

![](/Users/forteleaf/Library/Application Support/marktext/images/2019-09-06-16-16-11-image.png)

기본옵션 (Inventory)

hosts.ini파일을 아래와 같이 설정 된다. 파일 이름은 정해진 틀이 없으므로 편한데로 맞춰서 사용합니다.

centos1 ansible_host=172.16.49.133 ansible_user=root
centos2 ansible_host=172.16.49.134 ansible_user=root
zabbix ansible_host=172.16.49.135 ansible_user=root

[server]
centos1
centos2
zabbix

ssh-copy-id로 자동로그인을 설정해 놓으면 ansible_password와 같은 옵션을 따로 설정하지 않아도 된다.

설정파일 ( ansible.cfg / .ansible.cfg )

ansible.cfg파일을 지정해 줌으로서 옵션에 넣을 변수를 줄이고 편하게 사용할 수 있다

## ansible.cfg
[defaults]
inventofy=./hosts.ini
remote_user=root
private_key_file=~/.ssh/id_rsa

host_key_checking=false옵션을 추가하면, 접속시 key 확인하는 작업을 스킵합니다. 일일히 yes칠 상황을 제거해 줍니다

service 상태 조회

ansible all -m shell -a "service status sshd"

모듈 ( MODULE )

모듈들은 정말 다양한 기능들을 제공한다. 이런 기능은 없나? 생각하면 이미 개발되어 있는 상황이고 그게 안된다면, shell또는 command명령을 통해서 작업할 수 있다

shellcommand 모듈의 차이

Module : command

원격 노드에서 명령을 실행

명령 모듈은 명령 이름 뒤에 공백으로 구분 된 인수 목록을 사용합니다. 주어진 명령은 선택된 모든 노드에서 실행됩니다.
쉘을 통해 처리되지 않으므로 $HOME과 같은 변수 및 "<", ">", "|"및 "&"와 같은 조작은 작동하지 않습니다 (이 기능이 필요한 경우 쉘 모듈을 사용하십시오).

Module : shell

노드에서 명령을 실행

쉘 모듈은 명령 이름 뒤에 공백으로 구분 된 인수 목록을 사용합니다. 명령 모듈과 거의 동일하지만 원격 노드의 쉘 (/bin/sh)을 통해 명령을 실행합니다.

Module : template

nginx.ini와 같은 설정 파일을 role을 지정해서 서버마다 다른 설정 값을 넣어서 파일을 생성할 수 있는 기능입니다. 자주 사용되는 기능

PLAYBOOK

# public key 를 server들에 등록하는 playbook
---
- hosts: all    # inventory 의 모든 대상
  tasks:        # 수행할 작업
    - name: authorized to server    # 작업 이름
      authorized_key:               # 수행할 MODULE 명
        user: root                  # MODULE에 들어갈 environment
        state: present
        key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" 

yml(야믈)의 파일 구조를 갖고 있습니다. 규칙성에서 벗어나면 제대로 동작하지 않습니다. 이를 유의해 주시면서 작업 하시면 오히려 정규화 된 표현에 코드 리딩하기 편할 것 입니다.

authorized_key를 사용하기 위해서는 암호또한 자동으로 입력 해 주는 sshpass가 필요합니다.

유용한 유틸리티

문법체크

$ ansible-playbook --syntax-check [file]

호스트 나열

$ ansible-playbook --list-hosts [file]

테스크 나열

$ ansible-playbook --list-tasks[file]

#체크모드

$ ansible-playbook --check [file]

참조


반응형

+ Recent posts