나의 삽질 저장소!

Ansible Tips and trick! - ansible 이해하기 6편

by softPine

이번 목차는 Ansible 사용을 최적화 하는데 도움이 되는 팁과 요령을 제공하려 한다. 하지만 이러한 팁과 요령도 궁극적으로는 조직과 목표에 가장 적합한 방식으로 사용하는데 중점을 둬야 한다.

 

일반적인 팁

일반적인 팁들은 전부 ansible 활용 및 artifact들에 적용이 된다.

 

간단하게 유지하라

최대한 간단하게 유지한다. 필요한 경우에만 상위(고급) 기능을 사용하고 현재 사용 사례에 가장 적합한 기능을 선택한다. 예를들어 외부 inventory 파일을 사용하면서 vars, vars_files, vars_prompt 및 --extra-vars가 모두 필요하지 않을 수 있다. 뭔가 복잡하다고 느껴진다면 복잡한 것이다. 시간을 내서라도 더 간단하게 할 수 있는 방법을 찾아야 한다.

 

버전 관리를 사용하라

playbook, role, inventory 및 변수 파일을 git 또는 다른 VCS[각주:1]에 보관하고 변경 시 리포지터리에 커밋한다. 버전 컨트롤은 인프라를 변경한 내역을 한 시기와 내용을 추적할 수 있다.

 

Playbook 팁

playbook과 role을 보다 쉽게 읽을 수 있고, 유지 관리 및 디버깅 할 수 있는 팁들이다.

 

공백 사용

각 블록이나 task 앞쪽에 공백을 사용하여 indent를 맞추어서 좀 더 쉽게 코드를 볼 수 있또록 한다.

 

task의 이름 지정

task의 이름은 선택 사항이지만 이름을 지정하면 매우 유용하다. ansible은 실행되는 각 task의 이름을 보여준다. 각 task가 수행하는 작업과 해당 작업에 대한 이유를 설명하는 이름을 쓰게되면 ansible의 출력에서 보다 간편하게 볼 수 있다.

 

상태 언급

대부분의 모듈에서 state 매개 변수는 선택사항이다. 모듈마다 state에 대한 기본 설정이 다르며, 일부 모듈은 몇 가지 state 설정을 지원한다. state = present 또는 state = absent 를 명시적으로 설정을 하게되면 playbook과 role이 더 명확해진다.

 

Comment 사용

task 이름과 명시적인 상태가 있더라도 때로는 playbook이나 role(또는 inventory  / 변수 파일)의 내부에 더 많은 설명이 필요할 수 있다. 주석('#'으로 시작하는 모든 줄)을 추가하면 다른 사람이 play 또는 task(또는 변수 설정)가 무엇을 하는지, 어떻게 하는지, 그리고 그 이유를 이해하는데 도움이 된다.

 

Inventory 팁

이번 팁은 inventory를 잘 정리하는데 도움이 된다.

 

클라우드에서 dynamic inventory 사용

inventory를 수동으로 관리하는 것 자체가 큰 관리 리소스를 차지한다. 특히나 클라우드 같은 동적 리소스가 많거나 처음 inventory를 작성 시 많은 관리 리소스가 소모되므로 dynamic inventory를 사용하여 관리 리소스를 최소화한다. 클라우드 리소스는 태그를 사용하여 프로덕션 및 스테이징 환경을 차별화 할 수 있다.

 

기능별 inventory 그룹화

각 시스템은 여러 그룹에 속할 수 있다. 해당 내용에 대해서는 인벤 토리 구축 방법호스트와 그룹에 대한 타겟팅 패턴을 확인한다. 그룹의 노드 기능에 따라 이름이 지정된 그룹을 생성하는 경우(ex. Web or DB), playbook은 기능을 기반으로 시스템을 지정할 수 있다. 또한 그룹 변수 시스템을 사용하여 기능별 변수를 할당하고 기능별 사용 사례를 핸들링 하도록 ansible role을 설계할 수 있다. role은 다음 link에서 확인한다.

 

별도의 live 및 staging inventory 준비

각 환겨에 대해 별도의 inventory 파일 및 디렉터리를 사용하여 프로덕션 환경을 개발, 테스트 및 스테이징 환경과 별도로 유지할 수 있다. -i 플래그를 사용하여 환경별로 대상을 지정하면 된다. 모든 환경을 하나의 파일로 구성 시 엄청난 장애를 초래할 수 있다.

 

저장된 변수의 보안 유지

ansible vault로 민감한 변수 또는 비밀번호 같은 변수를 암호화해야 한다. 그러나 변수의 일므과 값이 암호화되면 값의 소스를 찾기가 어려워진다. 이럴땐 다음과 같은 간접 계층을 추가해 암호를 노출하지 않고 변수 이름에 접근할 수 있도록 유지할 수 있다(ex. grep).

  1. 그룹의 이름을 가진 디렉터리를 group_vars/ 하위에 생성한다.
  2. 이 하위 디렉터리에 vars와 vault라는 이름을 가진 2가지 파일을 생성한다.
  3. vars 파일에서 민감한 변수를 포함하여 필요한 모든 변수를 정의한다.
  4. 모든 민감한 변수를 vault 파일로 복사하고 복사한 변수 앞에 vault_ 라는 접두어를 붙인다.
  5. jinja2 구문을 사용하여 일치하는 vault_ 변수를 지정하도록 vars 파일의 변수를 수정한다: db_password: {{ vault_db_password }}.
  6. 내용 보호를 위해 vault 파일을 암호화한다.
  7. playbook 내부에서는 vars 파일의 변수 이름을 사용한다.

playbook을 실행하면 ansible은 암호화되지 않은 파일에서 변수를 찾아 암호화된 파일에서 중요한 변수값을 가져온다. 변수 및 vault 파일의 수 또는 파일 이름에는 제한이 없다.

 

실행 팁

이번 팁은 ansible artifacts가 아닌 ansible 사용에 적용된다.

 

staiging에서 먼저 실행

프로덕션 환경에 배포하기 전에 스테이징 환경에서 변경 사항을 테스트하는 것은 매우 좋은 방법이다. 환경간의 차이를 그룹 변수를 활용하여 제어할 수 있다.

 

일괄 업데이트

일괄 처리에서 한 번에 업데이트할 시스템의 수를 제어하려면 serial 키워드를 사용하면 된다. 해당 link를 참조한다.

 

OS 및 배포판 차이 처리

그룹 변수 파일과 group_by 모듈이 같이 작동하여 ansible이 다양한 설정, 패키지 및 도구를 필요로 하는 여러 운영 체제 및 배포판에서 실행할 수 있도록 지원한다. group_by 모듈은 특정 기준과 일치하는 동적 호스트 그룹을 만든다. 이 그룹은 inventory 파일에 정의할 필요가 없다. 이런 접근 방식을 사용하면 다양한 운영 체제 또는 배포판에서 다양한 작업을 실행할 수 있다.

---

 - name: talk to all hosts just so we can learn about them
   hosts: all
   tasks:
     - name: OS 배포에 따라 호스트 분류
       group_by:
         key: os_{{ ansible_facts['distribution'] }}

 # CentOS 호스트만 실행

 - hosts: os_CentOS
   gather_facts: False
   tasks:
     - # tasks that only happen on CentOS go in this play

첫 번째 play 에서는 운영 체제 이름에 따라 모든 시스템을 동적 그룹으로 분류한다. 이후에 play는 이러한 그룹을 호스트 라인의 패턴으로 사용할 수 있다. 또한 group_vars 파일에 그룹별 설정을 추가할 수 있다. group_by task에 의해 생성된 이름, 이후 play의 패턴 이름, group_vars 파일의 이름이 모두 일치해야 한다.

---
# file: group_vars/all
asdf: 10

---
# file: group_vars/os_CentOS.yml
asdf: 42

 

위 예제에서는 모든 호스트의 asdf 변수의 값은 10이지만 CentOS 시스템은 42의 값을 가지게된다. 이는 변수를 설정하는 것 뿐만 아니라 특정 시스템에만 특정 역할을 적용하는데 사용할 수 있다.

또한 task가 아닌 OS 별 변수만 필요한 경우 include_vars와 동일한 설정을 사용할 수 있다.

- hosts: all
  tasks:
    - name: Set OS distribution dependent variables
      include_vars: "os_{{ ansible_facts['distribution'] }}.yml"
    - debug:
        var: asdf

group_vars/os_CentOS.yml 파일에서 변수를 가져온다.

  1. Version Control System [본문으로]

블로그의 정보

나의 삽질저장소

softPine

활동하기