메뉴 닫기

Ansible을 활용한 시스템 백업 및 텔레그램 알림

Ansible을 활용한 시스템 백업 및 텔레그램 알림


현대 IT 환경에서 신속하고 안정적인 시스템 운영은 기업의 핵심입니다. 그러나 이러한 운영을 지원하기 위해서는 정기적인 백업 및 감시가 필수적입니다. 이에 대한 효과적인 솔루션 중 하나는 Ansible을 활용하여 자동화된 시스템 백업 및 결과 값 알림을 설정하는 것입니다. 이 글에서는 Ansible을 사용하여 시스템을 스마트하게 백업하고 백업 결과를 텔레그램으로 실시간으로 받아보는 방법에 대해 알아보겠습니다.

[개  요]

✅ 종    류 : 엔지니어링

✅ 난이도 : ⭐

✅ 내용요약 : Ansible을 활용한 백업과 텔레그램 알림

✅ 테스트환경 : CentOS7

✅ 관련직무 : 시스템&클라우드 엔지니어

[기초이론&용어설명]

[관련 기술자료]

 

Ansible은 IT 자동화를 위한 강력한 오픈 소스 도구로, 서버 설정, 배포, 관리, 네트워크 설정 등 다양한 IT 작업들을 자동화할 수 있습니다. Ansible은 에이전트 없이 동작하며 SSH를 통해 명령을 전달하고 결과를 수신합니다.


Ansible의 강점:

  1. 간편한 구성 관리: Ansible은 간단한 YAML 문법을 사용하여 인프라스트럭처의 구성을 정의하고 관리할 수 있습니다. 이는 사용자가 가독성 높은 설정 파일을 작성할 수 있게 도와주며, 높은 가독성은 협업과 유지보수를 향상시킵니다.

  2. 에이전트 없는 자동화: Ansible은 에이전트를 필요로하지 않고 SSH를 통한 원격 명령 실행을 기반으로 동작합니다. 이는 에이전트 설치 및 관리에 따른 번거로움을 제거하고, 확장성을 높여줍니다.

  3. 모듈화된 아키텍처: Ansible은 모듈로 구성되어 있어, 다양한 작업을 수행할 수 있습니다. 예를 들어, 서비스 시작, 파일 복사, 패키지 설치 등을 처리하는 모듈을 제공하며, 필요에 따라 사용자 정의 모듈을 추가할 수 있습니다.

  4. 멱등성: Ansible은 멱등성 개념을 강조합니다. 즉, 동일한 명령을 여러 번 실행하더라도 항상 동일한 상태로 유지됨을 보장합니다. 이는 예측 가능하고 안정적인 인프라 운영을 가능케 합니다.

  5. 커뮤니티와 통합성: Ansible은 활발한 커뮤니티와 함께 성장하고 있으며, 다양한 통합성을 제공합니다. 다양한 클라우드 프로바이더, 네트워크 장비, 컨테이너 플랫폼과의 통합을 통해 유연하고 강력한 자동화를 가능케 합니다.

 

 

Ansible을 활용한 백업 작업 설정 


1. Ansible 환경 구성

커널 업데이트 및 앤서블 패키지 설치

# apt -y update
# apt -y upgrade
# apt -y install ansible sshpass

앤서블 버전 확인

# ansible --version

 

 

인벤토리 생성

인벤토리 파일을 생성해 줍니다.

파일안에 그룹과 ip 또는 도메인을 입력합니다.

# vi /root/servers.ini
[web]
www.dodwnd.kro.kr
[db]
dodwnd.dodwnd.kro.kr
[backup]
dudwnd.dudwnd.kro.kr

ssh key를 생성하고 공개키를 서버에 복사

# ssh-keygen
# ssh-copy-id root@www.dodwnd.kro.kr 
# ssh-copy-id root@dodwnd.dodwnd.kro.kr
# ssh-copy-id root@dudwnd.dudwnd.kro.kr

연결 테스트 및 ssh 접속할 때 패스위드 입력이 필요 없는지 확인 합니다.

# ansible -i servers.ini all -m ping
# ssh root@www.dodwnd.kro.kr 
# ssh root@dodwnd.dodwnd.kro.kr
# ssh root@dudwnd.dudwnd.kro.kr

 

2. System Back UP 

Playbook 생성

시스템 백업내용의 플레이북 생성

# vi backup.yaml
---
- hosts: backup
  gather_facts: true
  tasks:
    - name: Debug ansible_mounts
      debug:
        var: ansible_mounts

    - name: Set package facts
      set_fact:
        ansible_packages: "{{ ansible_facts.packages_list | default([]) }}"

    - name: Install tar package
      become: yes
      package:
        name: tar
        state: present
      when: "'tar' not in ansible_packages"

    - name: Create /backup directory if it doesn't exist
      file:
        path: /backup
        state: directory
      when: not ansible_check_mode and (not ('/backup' is search(item.mount, '.*mount=\\\"/backup\\\".*')) | default(false))
      loop: "{{ ansible_mounts }}"

    - name: Get today's date
      set_fact:
        today_date: "{{ ansible_date_time.date }}"

    - name: Create directory for today's date
      file:
        path: "/backup/{{ today_date }}"
        state: directory

    - name: Backup /usr directory
      archive:
        path: /usr
        dest: "/backup/{{ today_date }}/usr_backup_{{ today_date }}.tar.gz"

    - name: Backup /etc directory
      archive:
        path: /etc
        dest: "/backup/{{ today_date }}/etc_backup_{{ today_date }}.tar.gz"

    - name: Backup /var directory
      archive:
        path: /var
        dest: "/backup/{{ today_date }}/var_backup_{{ today_date }}.tar.gz"

    - name: Execute 'ls' command to check the backup directory
      command: ls /backup/{{ today_date }}
      register: ls_result
      changed_when: false

    - name: Save 'ls' command output to result.txt file
      copy:
        content: "{{ ls_result.stdout_lines | join('\n') }}"
        dest: "/backup/{{ today_date }}/result.txt"
      when: not ansible_check_mode

위의 플레이북은 다음과 같은 실행 순서를 가지고 있습니다. 우분투 및 데비안 기반 시스템과 CentOS 및 Red Hat 기반 시스템에서 각각 tar 패키지를 설치합니다.

/backup 디렉토리를 생성하는 부분에 when 조건을 추가하여 디렉토리가 이미 존재하는 경우에는 작업이 수행되지 않도록 했습니다. 이를 통해 작업이 예기치 않게 실행되는 것을 방지할 수 있습니다.

현재 날짜를 이용하여 디렉토리를 생성하고, /usr, /etc, /var 디렉토리를 압축하여 백업합니다.

백업이 완료되면 백업 파일의 경로를 조회하여 result.txt 파일에 저장합니다.

 

 

주요 섹션과 작업들에 대한 설명입니다.

Debug ansible_mounts: ansible_mounts 변수를 디버깅하기 위해 사용됩니다. 이 변수에는 호스트의 마운트 정보가 포함되어 있습니다.

Set package facts: 호스트의 패키지 리스트를 ansible_packages라는 변수에 저장합니다. 이 변수는 후속 태스크에서 패키지 설치 여부를 확인하는 데 사용됩니다.

Install tar package: 호스트에 tar 패키지가 설치되어 있지 않은 경우, 패키지를 설치합니다. become: yes를 사용하여 관리자 권한으로 설치를 시도합니다.

Create /backup directory if it doesn’t exist: /backup 디렉토리를 만들어야 하는데, 만약 해당 디렉토리가 존재하지 않고, 해당 디렉토리가 마운트되어 있지 않은 경우에만 작업이 수행됩니다.

Get today’s date: ansible_date_time.date를 사용하여 오늘 날짜를 가져옵니다. 이 날짜는 백업 디렉토리의 하위 디렉토리 및 파일 이름에 사용됩니다.

Create directory for today’s date: 이전 단계에서 얻은 오늘 날짜를 사용하여 /backup/날짜 디렉토리를 생성합니다.

Backup /usr, /etc, /var directories: 각각 /usr, /etc, /var 디렉토리를 아카이브하여 오늘 날짜로 명명된 백업 디렉토리에 저장합니다.

Execute ‘ls’ command to check the backup directory: ls 명령어를 사용하여 생성된 백업 디렉토리의 내용을 확인합니다.

Save ‘ls’ command output to result.txt file: 이전 단계에서 얻은 ls 명령어의 결과를 result.txt 파일로 저장합니다. 이는 백업이 완료되었을 때 디렉토리 내용을 확인하는 데 도움이 됩니다.

위의 플레이북은 각 태스크가 이전 단계의 결과에 의존하여 진행되므로 작업을 체인 형태로 수행하고 있습니다. 결과적으로 백업이 성공적으로 완료되면 result.txt 파일에 백업 디렉토리의 내용이 저장됩니다.

 

 

3. 텔레그램 알림 설정


Telegram Token Chat ID

Telegram Token

BotFather를 검색 후 채팅을 시작합니다.

Chat ID

 

1. /newbot을 입력하여 bot을 생성합니다.

2. 대화방의 이름을 정합니다.

3. 생성된 bot의 이름을 정하여 줍니다. 마지막에 _bot이 포함되어야 합니다.

4. Use this token to access the HTTP API: 에서 발급 받은 토큰을 확인합니다.

5. api.telegram.org/bot발급 받은 토큰/getUpdates를 입력하여 줍니다.

6. 생성된 bot에게 대화를 시작합니다.

7. api.telegram.org/bot발급 받은 토큰/getUpdates 웹 페이지를 새로고침 합니다.

8. id: 뒤에 나오는 숫자가 Chat ID입니다.
9. 서버로 돌아와 텔레그램을 이용할 수 있는 플러그인을 설치합니다.a
# ansible-galaxy collection install community.general

 

YAML 파일 수정하기

# vi /Telegram.yml

# ---
- hosts: backup
  gather_facts: true
  tasks:
    - name: Debug ansible_mounts
      debug:
        var: ansible_mounts

    - name: Set package facts
      set_fact:
        ansible_packages: "{{ ansible_facts.packages_list | default([]) }}"

    - name: Install tar package
      become: yes
      package:
        name: tar
        state: present
      when: "'tar' not in ansible_packages"

    - name: Create /backup directory if it doesn't exist
      file:
        path: /backup
        state: directory
      when: not ansible_check_mode and (not ('/backup' is search(item.mount, '.*mount=\\\"/backup\\\".*')) | default(false))
      loop: "{{ ansible_mounts }}"

    - name: Get today's date
      set_fact:
        today_date: "{{ ansible_date_time.date }}"

    - name: Create directory for today's date
      file:
        path: "/backup/{{ today_date }}"
        state: directory

    - name: Backup /usr directory
      archive:
        path: /usr
        dest: "/backup/{{ today_date }}/usr_backup_{{ today_date }}.tar.gz"

    - name: Backup /etc directory
      archive:
        path: /etc
        dest: "/backup/{{ today_date }}/etc_backup_{{ today_date }}.tar.gz"

    - name: Backup /var directory
      archive:
        path: /var
        dest: "/backup/{{ today_date }}/var_backup_{{ today_date }}.tar.gz"

    - name: Execute 'ls' command to check the backup directory
      command: ls /backup/{{ today_date }}
      register: ls_result
      changed_when: false

    - name: Save 'ls' command output to result.txt file
      copy:
        content: "{{ ls_result.stdout_lines | join('\n') }}"
        dest: "/backup/{{ today_date }}/result.txt"
      when: not ansible_check_mode

    - name: Read file content
      slurp:
        src: "/backup/{{ today_date }}/result.txt"
      register: file_content

    - name: send notify to telegram
      community.general.telegram:
        token: "6906613667:AAEC_Gj8BzL1aV6JENkIzMiuJdeoPQOlSnw"
        api_args:
          chat_id: 5625059848
          text: |
            작업 결과:
            {{ file_content['content'] | b64decode }}
          parse_mode: "HTML"

 

주요 섹션과 작업들에 대한 설명입니다.

Read file content:

result.txt’ 파일의 내용을 읽어와 ‘file_content’ 변수에

저장합니다.

Send notify to telegram:

community.general.telegram’모듈을 사용하여 Telegram으로 작업 결과를 전송합니다.

작업 결과는 ‘result.txt’ 파일의 내용으로, HTML로 파싱되어 전송됩니다.

 

YAML 파일 실행하기

playbook 명령어를 이용하여 yaml 파일 실행

# ansible-playbook -i servers.ini -l backup Telegram.yaml

위에 명령어를 이용하여 Telegram.yaml 파일을 실행합니다.

아래와 같이 작업을 완료 후 telegram으로 작업 결과를 전송합니다.

 

ansible을 활용한 시스템 백업 및 텔레그램 알림

감사합니다.

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x