본문 바로가기

IT Note/Programming

[Ansible] 좀 더 알아보자

Overview
이번 포스팅에서는 Ansible 배포를 위해 알면 좋은 몇가지 기능들을 추가적으로 알아보겠습니다.

1. Ansible.cfg
Ansible 구성
Ansible은 제어 노드(ansible.cfg)를 여러 위치에  선택할 수 있습니다. 

• /etc/ansible/ansible.cfg 
ansible 패키지에서는 /etc/ansible/ansible.cfg에 있는 기본 구성 파일을 제공합니다. 이 파일은 다른 구성
파일이 없는 경우 사용됩니다.
•  ~/.ansible.cfg
사용자의 홈 디렉터리에서 .ansible.cfg 파일을 찾습니다. 이 구성이 존재하고 현재 작업 디렉터리에 ansible.cfg 파일이 없는 경우 /etc/ansible/ansible.cfg 대신 이 구성이 사용됩니다.
• ./ansible.cfg 
ansible.cfg 파일이 ansible 명령이 실행되는 디렉터리에 있는 경우 글로벌 파일 또는 사용자의 개인 파일 대신 사용됩니다. 

다음은 일반적인 ansible.cfg 파일입니다.
[defaults]
inventory = ./inventory
remote_user = user
ask_pass = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false

Ansible 구성
지시문     설명
inventory    인벤토리 파일의 경로를 지정합니다.
remote_user    관리 호스트에 로그인할 사용자의 이름입니다. 지정하지 않으면 현재 사용자의 이름이 사용됩니다.
ask_pass SSH    암호를 요청하는 메시지 표시 여부입니다. SSH 공개 키 인증을 사용하는 경우 false일 수 있습니다.
become    연결 후 관리 호스트에서 자동으로 사용자를 전환할지 여부입니다(일반적으로 root로 전환). 이는 플레이로도 지정할 수 있습니다.
become_method    사용자 전환 방식입니다(일반적으로 기본값인 sudo를 사용하며,su는 옵션임).
become_ask_pass     become_method의 암호를 요청하는 메시지 표시 여부입니다. 기본값은 false입니다.

2. 핸들러(Handler)
핸들러는 다른 작업에서 트리거한 알림에 응답하는 작업입니다. 작업은 관리 호스트에서 작업이 변경될 때만 핸들러에 통지합니다. 각 핸들러에는 전역적으로 고유한 이름이 있으며, 플레이북의 작업 블록 끝에서 작동합니다. 핸들러는 notify 문을 사용하여 명시적으로 호출된 경우에만 작동합니다. 
다음 은 구성 파일이 업데이트되고 이를 알리는 경우에만 restart apache 핸들러에서 Apache서버를 다시 시작하는 방법입니다.
tasks:
  - name: copy demo.example.conf configuration template
    template:
      src: /var/lib/templates/demo.example.conf.template
      dest: /etc/httpd/conf.d/demo.example.conf
    notify:
      - restart apache
handlers:
  - name: restart apache
    service:
      name: httpd
      state: restarted

3. 진자2(Jinja2)
변수 및 논리 표현식은 태그의 사이 또는 구분 기호 사이에 배치되는데 Jinja2 템플릿은 식 또는  반복문에 {% EXPR %}을 사용하지만, {{ EXPR }}은 식 또는 변수 결과를 최종 사용자에게 출력하는 데 사용됩니다. 두 번째 태그는 렌더링 시 값으로 바뀌고, 최종 사용자에게 표시됩니다. {# COMMENT #}
구문을 사용하여 최종 파일에 표시되지 않아야 하는 주석을 묶을 수 있습니다.

템플릿 파일에서 Jinja2 제어 구조를 사용하여 반복적인 입력 작업을 줄이고, 플레이에 각 호스트에 대한 항목을 동적으로 입력하거나, 텍스트를 파일에 조건부로 삽입할 수 있습니다.
좀 더 실질적인 예를 들자면, 이것을 사용하여 호스트 팩트에서 /etc/hosts 파일을 동적으로 생성할 수 있습니다. 
- name: /etc/hosts is up to date
  hosts: all
  gather_facts: yes
  tasks:
    - name: Deploy /etc/hosts
      template:
        src: templates/hosts.j2
        dest: /etc/hosts
다음과 같은 3줄의 templates/hosts.j2 템플릿이 all 그룹에 있는 모든 호스트의 파일을 구성합니다. (변수 이름의 길이로 인해 템플릿에서 중간선이 극도로 깁니다.) 그룹의 각 호스트에 대해 반복되어 /etc/hosts 파일에 대한 3가지 팩트를 얻습니다.
{% for host in groups['all'] %}
{{ hostvars['host']['ansible_facts']['default_ipv4']['address'] }}
{{ hostvars['host']['ansible_facts']['fqdn'] }} {{ hostvars['host']
['ansible_facts']['hostname'] }}
{% endfor %}

4. 애드혹(ad-hoc) & 모듈(module)
애드혹 명령은 추후 재사용을 위하여 별도의 파일로 저장을 고려하지 않는 경우 하나의 Ansible 작업을 신속하게 실행하는 방법입니다.
애드혹 명령 실행
    ansible host-pattern -m module [-a 'module arguments'] [-i inventory]
-m 옵션은 Anible이 대상 호스트에서 실행해야 하는 모듈의 이름을 인수로 사용합니다. 모듈은 작업을 구현하기 위해 실행되는 작은 프로그램입니다. 일부 모듈(module)은 추가 정보가 필요하지 않지만 다른 모듈들은 작업의 세부 사항을 지정하는 추가 인수(argument)가 필요합니다. -a 옵션은 그러한 인수의 목록을 따옴표가 추가된 문자열(quoted string)로 취합니다.

모듈은 애드혹 명령이 작업을 수행하는 데 사용하는 도구입니다. Ansible은 서로 다른 작업을 수행하는 수백개의 module을 제공합니다.

5. Ansible galaxy
Ansible Galaxy [https://galaxy.ansible.com]는 여러 Ansible 관리자와 사용자가 작성한 공용 Ansible 역할 라이브러리입니다. 수천 개의 Ansible 역할이 포함되어 있으며 Ansible 사용자가 관리 작업을 수행하는 데 도움이 되는 역할을 식별할 수 있는 검색 가능한 데이터베이스가 있습니다. 
Ansible Galaxy를 명령어로 이용해서 role을 설치할 수 있습니다. role은 사용자의 roles_path에서 쓰기 가능한 첫 번째 디렉터리에 설치됩니다. 
Ansible에 설정된 기본값 roles_path에 따라 일반적으로 역할은 사용자의 ~/.ansible/roles 디렉터리에 설치됩니다. 
Ansible-galaxy를 사용하여 텍스트 파일에서 정의를 기반으로 역할 목록을 설치할 수 있습니다.
예를들어 특정 roles가 설치되어 있어야 하는 플레이북이 있는 경우 필요한 역할을 지정하는 프로젝트 디렉터리에 roles/requirements.yml 파일을 만들 수 있습니다
- src: geerlingguy.redis
  version: "1.5.0"

src 속성은 roles의 소스를 지정합니다. 이 경우에는 Ansible Galaxy의 geerlingguy.redis입니다. version 속성은 선택 사항이며, 설치할 역할의 버전을 지정합니다. 

6. System-roles를 이용해서 시간동기화 작성하기
서버에서 NTP 시간 동기화를 구성해야 한다고 가정합니다. 필요한 각 작업을 수행하기 위해 자동화를 직접 작성할 수 있습니다.
NTP 서버를 수동으로 구성하기 위해 역할에 timesync_ntp_servers라는 변수가 있습니다. 이 변수는 사용할 NTP 서버 목록을 가져옵니다
속성     목적
hostname    동기화할 NTP 서버의 호스트 이름입니다.
iburst    빠른 초기 동기화를 활성화 또는 비활성화하는 부울입니다. 역할에서 기본값은 no로 설정되며 일반적으로 이를 yes로 설정해야 합니다.

다음 예제는 빠른 초기 동기화를 사용하여 3개의 NTP 서버에서 시간을 가져오도록 관리 호스트를 구성하기 위해 rhel-system-roles.timesync 역할을 사용하는 플레이입니다. 
- name: Time Synchronization Play
  hosts: servers
  vars:
    timesync_ntp_servers:
      - hostname: 0.rhel.pool.ntp.org
        iburst: yes
      - hostname: 1.rhel.pool.ntp.org
        iburst: yes
      - hostname: 2.rhel.pool.ntp.org
        iburst: yes
    timezone: UTC
  roles:
    - rhel-system-roles.timesync
  tasks:
    - name: Set timezone
      timezone:
        name: "{{ timezone }}"

Ansible을 이용해 플레이북을 작성해서 서버들을 관리하기 위해 필요한 몇가지 기능들을 정리해보았습니다. 다음 시간에는 좀 더 유용한 ansible기능을 소개하는 시간을 갖도록 하겠습니다.

반응형

'IT Note > Programming' 카테고리의 다른 글

호다닥 공부해보는 SOAP  (0) 2022.05.28
OpenAPI 란? (feat. Swagger)  (1) 2022.03.26
[Ansible] 유용한 기능들 - When, Debug, Tag  (0) 2020.12.31
Ansible Basics  (0) 2020.11.13
[웹개발] 브라우저의 작동 원리  (0) 2020.02.28