콘텐츠로 이동

Ansible 배치 처리 실전 가이드


소프트웨어 개요

Ansible은 Python 기반의 자동화 운영 도구로, 여러 운영 도구(puppet, chef, func, fabric)의 장점을 통합하여 배치 시스템 구성, 배치 프로그램 배포, 배치 명령 실행 등의 기능을 제공합니다.

기능 특징

  1. 배포가 간편하며, 마스터 노드에만 Ansible 환경을 구성하면 되고, 대상 노드에는 별도 작업이 필요하지 않음
  2. 기본적으로 SSH 프로토콜을 사용하여 장비를 관리
  3. 다양한 일반 운영 작업 모듈을 제공하여 일상적인 대부분의 작업을 수행 가능
  4. 구성이 간단하고, 기능이 강력하며, 확장성이 뛰어남
  5. API 및 사용자 정의 모듈을 지원하며, Python을 통해 쉽게 확장 가능
  6. Playbooks를 통해 강력한 구성 및 상태 관리를 지원

기본 아키텍처

image.png

  • Ansible: Ansible 핵심 프로그램
  • HostInventory: Ansible이 관리하는 호스트 정보(포트, 비밀번호, IP 등)를 기록
  • Playbooks: YAML 형식 파일로, 여러 작업을 하나의 파일에 정의하며, 호스트가 어떤 모듈을 호출하여 기능을 수행할지 정의
  • CoreModules: 핵심 모듈로, 주로 핵심 모듈을 호출하여 관리 작업을 수행
  • CustomModules: 사용자 정의 모듈로, 핵심 모듈로 수행할 수 없는 기능을 구현하며, 여러 언어를 지원
  • ConnectionPlugins: 연결 플러그인으로, Ansible과 호스트 간 통신에 사용

작업 실행

Ansible 시스템은 제어 호스트가 관리 대상 노드를 조작하는 방식에 따라 ad-hocplaybook 두 가지로 나뉩니다

  • ad-hoc 모드(점대점 모드) 단일 모듈을 사용하며, 단일 명령을 배치로 실행할 수 있습니다. ad-hoc 명령은 빠르게 입력할 수 있고 저장할 필요가 없는 명령으로, bash의 한 줄 셸 명령과 유사합니다.

  • playbook 모드(스크립트 모드) Ansible의 주요 관리 방식이자 Ansible의 강력한 기능의 핵심입니다. playbook은 여러 task를 조합하여 웹 서비스 설치/배포, 데이터베이스 서버 배치 백업 등과 같은 기능을 수행합니다. playbook은 여러 ad-hoc 작업을 조합한 설정 파일로 이해하면 됩니다.

배치 처리 실전 가이드

환경 준비

IP 시스템 호스트명 설명
10.0.0.65 CentOS 7.8 ansible01 Ansible 관리 노드 (DK 설치 완료)
10.0.0.66 CentOS 7.8 ansible02 관리 대상 노드 1
10.0.0.67 CentOS 7.8 ansible03 관리 대상 노드 2

소프트웨어 설치

ansible01에 로그인하여 설치 명령을 실행합니다

yum install -y ansible

주요 프로그램

  • /usr/bin/ansible 메인 프로그램
  • /usr/bin/ansible-doc 설정 문서
  • /usr/bin/ansible-playbook 자동화 작업 및 스크립트 도구
  • /usr/bin/ansible-pull 원격 명령 실행 도구
  • /usr/bin/ansible-vault 파일 암호화 도구

주요 설정 파일

  • /etc/ansible/ansible.cfg 메인 설정 파일
  • /etc/ansible/hosts 호스트 인벤토리(관리 대상 호스트를 이 파일에 추가)
  • /etc/ansible/roles/ 역할을 저장하는 디렉터리

비밀번호 없는 로그인

ansible01에 로그인하여 키를 생성합니다. 기본 경로는 /root/.ssh/id_rsa, /root/.ssh/id_rsa.pub입니다

ssh-keygen

키를 관리 대상 노드에 배포합니다

ssh-copy-id root@10.0.0.66
ssh-copy-id root@10.0.0.67

호스트 인벤토리 파일 /etc/ansible/hosts를 수정하여 그룹 이름과 호스트 IP를 추가합니다

[guance]
10.0.0.67
10.0.0.66

연결 상태를 확인합니다

ansible guance -m ping

image.png

주요 모듈

Shell 모듈

Shell 모듈은 원격 호스트에서 셸 인터프리터를 호출하여 명령을 실행할 수 있으며, 파이프 등 다양한 셸 기능을 지원합니다

  • 현재 사용자 ID 확인
ansible guance -m shell -a 'id'

image.png

  • 현재 시스템에 로그인한 사용자 확인
ansible guance -m shell -a 'who'

image.png

Copy 모듈

이 모듈은 파일을 원격 호스트로 복사하는 데 사용되며, 지정된 내용으로 파일 생성 및 권한 수정 등을 지원합니다

  • ansible.cfg 파일을 원격 호스트로 복사하고 권한을 "읽기/쓰기" -rw-rw-rw-로 지정
ansible guance -m copy -a 'src=/etc/ansible/ansible.cfg dest=/tmp/ansible.cfg mode=666'

image.png

원격 호스트의 ansible.cfg 파일 확인

ansible guance -m shell -a 'ls -l /tmp/ansible.cfg'

image.png

  • 내용을 지정하여 파일 생성
ansible guance -m copy -a 'content="hello world" dest=/tmp/hello mode=666'

image.png

원격 호스트 파일 확인

ansible guance -m shell -a 'cat /tmp/hello'

image.png

File 모듈

이 모듈은 파일의 속성을 설정하는 데 사용되며, 파일 생성, 심볼릭 링크 파일 생성, 파일 삭제 등을 지원합니다

  • /tmp 디렉터리 아래에 app 디렉터리 생성
ansible guance -m file -a 'path=/tmp/app state=directory'

image.png

/tmp 디렉터리 확인

ansible guance -m shell -a 'ls -l /tmp'

image.png

  • 이전에 ansible01에서 복사한 ansible.cfg 파일 삭제
ansible guance -m file -a 'path=/tmp/ansible.cfg state=absent'

image.png

Fetch 모듈

이 모듈은 원격 호스트에서 파일을 가져와(복사하여) 로컬로 저장하는 데 사용됩니다

  • 원격 호스트의 /tmp/hello 파일을 /root 디렉터리로 가져오기
ansible guance -m fetch -a 'src=/tmp/hello dest=/root'

image.png

/root 디렉터리 아래에 두 개의 새 디렉터리(원격 호스트 IP가 디렉터리 이름이 됨)가 생성된 것을 확인할 수 있습니다

yum -y install tree
tree /root

image.png

Guance 적용

배치 설치

Shell 모듈을 사용하여 DataKit 설치 (해당하는 token으로 변경 필요)

ansible guance -m shell -a 'DK_DATAWAY="https://openway.guance.com?token=token" bash -c "$(curl -L https://static.guance.com/datakit/install.sh)"'

프로세스가 실행 중인지 확인

ansible guance -m shell -a 'ps -ef|grep datakit|grep -v grep'

image.png

배치 설정

  • netstat 플러그인 활성화

shell 모듈을 사용하여 netstat.conf.sample 파일을 netstat.conf로 복사

ansible guance -m shell -a 'cp /usr/local/datakit/conf.d/host/netstat.conf.sample /usr/local/datakit/conf.d/host/netstat.conf'

DataKit 배치 재시작

ansible guance -m shell -a 'systemctl restart datakit'

배치 업그레이드

DataKit 업그레이드 yaml 파일 생성, /etc/ansible/dk_upgrade.yaml

- hosts: guance
  remote_user: root
  tasks:
    - name: dk version check
      shell: datakit --version|grep -i upgrade|wc -l
      register: version
    - name: dk upgrade
      when: version.stdout > "0"
      shell: DK_UPGRADE=1 bash -c "$(curl -L https://static.guance.com/datakit/install.sh)"

playbook 실행

ansible-playbook /etc/ansible/dk_upgrade.yaml

image.png

DataKit 버전이 최신 버전으로 업데이트된 것을 확인

ansible guance -m shell -a 'datakit --version'

image.png

crontab -e에 예약 작업 추가 (매일 02시 02분에 배치 업그레이드 실행)

02 02 * * * ansible-playbook /etc/ansible/dk_upgrade.yaml

문서 평가

이 페이지가 도움이 되었나요?