본문 바로가기
자빅스/Case Study

Case Study- Ansible 기반의 Zabbix 에이전트 배포

by chloefordmove 2024. 4. 5.

안녕하세요! 디무브 입니다.

기업 내에서 Zabbix 에이전트를 기반으로 모니터링 환경을 구축하고 계시나요? 보통 에이전트 패키지는 서버에 일일이 설치하는 것이 일반적이지만 수천 대 혹은 수만 대 이상의 에이전트를 일일이 설치할 경우 비용, 시간, 실수에 따른 안정성 불일치 등 많은 단점이 발생합니다.

그래서 대부분의 기업에서는 IaC(Infrastructure as Code) 원칙을 기반으로 스크립트나 구성, 자동화 배포 도구 등을 활용하는 인프라의 구성 관리 및 배포 자동화 방법을 통해 관리하고 있습니다.

Ansible 역시 IaC의 원칙을 기반으로 파이썬을 사용한 모듈과 명령어를 사용하여 IT 인프라를 자동화할 수 있는 도구입니다. Ansible은 인프라의 설정을 코드 형태로 작성할 수 있게 하여, 다수의 서버에 동일한 환경을 효과적이고 일관성 있게 배포할 수 있습니다. 이로 인해 인프라 환경의 일관성을 유지하고, 배포 과정에서의 실수를 최소화하며, 시간과 노력을 크게 절약할 수 있도록 할 수 있습니다.

이번 콘텐츠에서는 자동화 배포 도구인 Ansible을 이용하여 Zabbix 에이전트를 자동으로 배포하는 방법에 대해 살펴보겠습니다.

 


 

🟥 Ansible의 구조

 

제어 노드(Control Node)
Ansible이 설치된 모든 호스트입니다. 제어 노드에서는 ansible 또는 ansible-playbook 명령을 이용하여 작업을 실행할 수 있습니다.

관리 노드(Managed Node)
제어 노드로 인해 배포 및 관리하는 호스트 및 네트워크 장치를 의미하며 별도의 에이전트가 설치되지 않습니다.

인벤토리(Inventory)
관리 노드의 목록으로, 관리 노드에 대한 호스트 이름이나 IP 주소와 같은 정보를 지정합니다. 여러 관리 노드를 그룹으로 조직화할 수 있고, 중첩 그룹을 사용할 수 있습니다.

플러그인(Plugins)
Ansible의 핵심 기능을 확장할 수 있도록 다양한 플러그인을 제공합니다.

모듈(Module)
Ansible을 실행하는 단일 명령어 혹은 수행할 작업을 지칭합니다. 하나의 모듈은 하나의 작업을 실행할 수 있고 플레이북을 이용해 여러 모듈을 선언해 여러 작업을 수행할 수 있습니다.

작업(Task)

Ansible의 작업 실행 단위입니다. 하나의 모듈이 하나의 작업이 되며, Ad-hoc 명령을 통해 단일 작업을 수행하거나, 플레이북을 작성해 여러 작업을 실행할 수 있습니다.

 


 

🟥 Ansible을 이용해 Zabbix Agent 배포

 

자, 이제 Ansible를 이용해 Zabbix 에이전트를 배포해 보도록 하겠습니다. 이번 콘텐츠에서는 CentOS7 환경의 Zabbix 6버전에 대한 에이전트를 배포할 예정입니다.

 

ℹ️ Pre-Config

Ansible은 SSH 인증을 기반으로 배포되며 이를 위해 Ansible이 설치된 Control Node에서 공개키를 생성 후 배포할 서버에 전달합니다. SSH 인증이 완료되고 배포 시 기본적으로 전달된 모듈은 대개 파이썬 파일을 전달합니다. 전달된 파이썬 파일은 배포 서버에 내장된 파이썬을 이용해 실행이 되며 실행된 파이썬 파일은 목적에 맞게 서버 환경을 변화시킵니다. 그리고 실행한 작업에 대한 결과를 다시 Ansible에 결괏값을 전달합니다.

 

■ 공개 키 생성

ssh-keygen -t rsa 

# passphrase 미설정에 대한 ssh-key 생성
[root@Jackson-Kubernetes-Master ansible]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:0J3vDAUyDqaPambqcTFD21i3svZabSz3YMd8OMASfPM root@Jackson-Kubernetes-Master
The key's randomart image is:
+---[RSA 3072]----+
|      o o .      |
|     o.+ + o     |
|   ....+ooo .    |
|  . =o..= oo     |
|   *.o.oSo.E.    |
|   .+ o + ++.    |
| .=. o o B *o.   |
| =o . o = + o    |
|o.   ...   .     |
+----[SHA256]-----+

 

■ 공개 키를 배포 서버에 복사

ssh-copy-id root@10.220.0.216

[root@Jackson-Kubernetes-Master ansible]# ssh-copy-id root@10.220.0.216
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.220.0.216's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@10.220.0.216'"
and check to make sure that only the key(s) you wanted were added.

 

 

Step 1
호스트 인벤토리 등록

 

배포할 서버에 대한 정보를 인벤토리에 등록하겠습니다.
기본적으로 Ansible의 인벤토리 경로는 /etc/ansible/hosts 경로를 참고합니다.
아래 예시의 경우 호스트 그룹을 기반으로 에이전트의 IP를 기준으로 인벤토리를 구성한 예시입니다.

[zabbix-agent-CentOS7]
10.220.0.216
10.220.0.219

 

Step 2
플레이북 작성

 

플레이북은 쉽게 배포할 내용에 대해 순서를 정하는 것이며, 플레이북을 읽고 작업을 수행할 노드에게 순서대로 작업을 진행되도록 합니다. 플레이북은 Yaml 파일 형식에 맞게 크게 3개의 부분으로 작성합니다.

(1) 타깃 : 실행 호스트, 스크립트를 수행할 사용자 등 정의

- name: Copy Zabbix Agent File
  hosts: zabbix-agent-CentOS7

 

(2) 변수 : 사용 가능한 변수 정의

vars:
    zabbix_rpm: '/root/ansible/zabbix-release-6.0-4.el7.noarch.rpm'
    zabbix_agent_conf: '/root/ansible/zabbix-agentd.conf'
    dest: '/root/zabbix-release-6.0-4.el7.noarch.rpm'

 

(3) 테스크 : 실행하고 싶은 작업 정의

tasks:
    - name: Copy Zabbix Agent RPM
      copy:
        src: "{{ zabbix_rpm }}"
        dest: /root/

 

이제 Zabbix 에이전트를 배포하기 위한 플레이북을 작성합니다. 저는 아래와 같은 목표를 두고 플레이북을 작성했습니다.

  • Managed Node의 rpm 파일을 에이전트 노드로 복사할 수 있어야 하는 것
  • 에이전트 노드로 복사된 rpm 파일을 활용해 에이전트가 설치되어야 하는 것
  • 플레이북의 설정대로 Zabbix 에이전트의 설정을 변경되도록 하는 것
  • 최종적으로 데몬 형태로 Zabbix 에이전트가 서비스로 실행되도록 하는 것

 

완성된 플레이북 리스트의 예제는 아래와 같이 구성했습니다.

- name: Copy Zabbix Agent File
  hosts: zabbix-agent-CentOS7
  become: true
  vars:
    zabbix_rpm: '/root/ansible/zabbix-release-6.0-4.el7.noarch.rpm'
    zabbix_agent_conf: '/root/ansible/zabbix-agentd.conf'
    dest: '/root/zabbix-release-6.0-4.el7.noarch.rpm'
  tasks:
    - name: Copy Zabbix Agent RPM
      copy:
        src: "{{ zabbix_rpm }}"
        dest: /root/

    
    - name: Install Zabbix-agent
      yum:
        name:
          - "{{ dest }}"
          - zabbix-agent
        state: present
  
 *** 중략 ***

    - name: Zabbix-Agent Start
      systemd:
        state: started
        name: zabbix-agent

    - name: Open Zabbix Agent Port
      shell: firewall-cmd --permanent --add-port=10050/tcp && firewall-cmd --reload

 

Step 3
Zabbix 에이전트 배포

 

이제 에이전트를 배포해 보도록 하겠습니다. 배포는 Ansible이 배포된 Control Node에서 배포해야 하며 아래 명령어로 배포하며 플레이북에 작성한 순서대로 Task가 실행됩니다.

[root@Jackson-Kubernetes-Master ansible]# ansible-playbook zabbix-agent-playbook.yaml
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details

PLAY [Copy Zabbix Agent File] ******************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************
ok: [10.220.0.216]
ok: [10.220.0.219]

TASK [Copy Zabbix Agent RPM] *******************************************************************************************************************************
ok: [10.220.0.219]
ok: [10.220.0.216]

TASK [Install Zabbix-agent] ********************************************************************************************************************************
ok: [10.220.0.219]
ok: [10.220.0.216]

TASK [Move zabbix_agentd.conf to /etc/zabbix directory] ****************************************************************************************************
ok: [10.220.0.216]
ok: [10.220.0.219]

***중략***

TASK [Update ExecStart parameter in zabbix-agent systemd service file] *************************************************************************************
changed: [10.220.0.219]
changed: [10.220.0.216]

TASK [Reload systemd configuration] ************************************************************************************************************************
changed: [10.220.0.219]
changed: [10.220.0.216]

TASK [Open Zabbix Agent Port] ******************************************************************************************************************************
changed: [10.220.0.216]
changed: [10.220.0.219]

PLAY RECAP *************************************************************************************************************************************************
10.220.0.216               : ok=8    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
10.220.0.219               : ok=8    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

Step 4
에이전트 배포 확인

 

에이전트 배포가 성공적으로 완료되면 에이전트 서버에서 에이전트 설정과 서비스가 정상적으로 실행되는지 확인합니다.

 Agent Config 설정

1) Server IP

 

2) HostMetaData

에이전트 서비스 상태

[root@Ansible-Test2 etc]# systemctl status zabbix-agent
● zabbix-agent.service - Zabbix Monitor Agent
   Loaded: loaded (/usr/lib/systemd/system/zabbix-agent.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2024-02-12 00:08:18 KST; 19s ago
 Main PID: 31163 (zabbix_agentd)
   CGroup: /system.slice/zabbix-agent.service
           ├─31163 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -f
           ├─31165 /usr/sbin/zabbix_agentd: collector [idle 1 sec]
           ├─31166 /usr/sbin/zabbix_agentd: listener #1 [waiting for connection]
           ├─31167 /usr/sbin/zabbix_agentd: listener #2 [waiting for connection]
           ├─31168 /usr/sbin/zabbix_agentd: listener #3 [waiting for connection]
           └─31169 /usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]

Feb 12 00:08:18 Ansible-Test2 systemd[1]: Started Zabbix Monitor Agent.
Feb 12 00:08:18 Ansible-Test2 systemd[1]: Starting Zabbix Monitor Agent...
Feb 12 00:08:18 Ansible-Test2 zabbix_agentd[31163]: Starting Zabbix Agent [Ansible-Test2]. Zabbix 6.0.25 (revision 1706b11e866).
Feb 12 00:08:18 Ansible-Test2 zabbix_agentd[31163]: Press Ctrl+C to exit.

 

 

지금까지 Ansible을 통해 Zabbix 에이전트를 배포하는 과정에 대해 알아보았습니다.
위 과정을 아래 이미지를 참고하여 정리해 보면 다음과 같습니다.

 

  • 에이전트를 배포할 인벤토리를 작성한다.
  • 에이전트를 배포하는 과정에 대한 플레이북을 작성한다.
  • Ansible Control Node에서 SSH 인증을 통해 각 에이전트 서버에 에이전트를 배포한다.

 

 


 

🟥 호스트 자동 등록

 

Ansible을 통해 Agent를 배포한 후에는 Zabbix 웹 UI에서 호스트를 등록해야 합니다. 하지만 일일이 호스트를 등록하기는 매우 번거로운 작업인데요. 이를 위해 Zabbix에서는 Discovery 기능을 통해 자동으로 호스트를 등록할 수 있습니다.

기본적으로 Zabbix Agent에 등록된 HostMetaData 값을 기반으로 호스트를 자동적으로 등록할 수 있는데요. 그렇다면 어떻게 디스커버리를 등록하여 호스트를 자동적으로 등록할 수 있는지 알아보도록 하겠습니다.

 

Step 1
디스커버리 설정

 

우선 등록할 호스트를 찾기 위한 디스커버리 설정이 필요합니다. 이를 위해서는 Zabbix Agent의 IP 주소 대역과 연결 확인을 위한 검사 항목, 호스트 등록 시 선택할 호스트명, 표시명 등을 등록합니다.

 

 

Step 2
Auto Registration 설정

 

다음은 호스트를 자동적으로 등록하기 위한 액션 설정이 필요합니다. 액션의 종류 중 하나인 Auto Registration 액션을 통해 zabbix_agentd.conf 파일에 설정된 Host MetaData 값을 기반으로 등록할 호스트 정보를 찾습니다.

 

등록할 호스트 정보를 찾게 될 경우 호스트 정보를 추가하고 등록할 템플릿 등을 설정할 수 있습니다.

 

디스커버리과 액션을 설정하고 정상적으로 호스트들을 찾게 되면 자동으로 디스커버리에 등록된 호스트, 표시 명 등을 참고하여 호스트를 등록할 수 있습니다.

 


 

지금까지 Ansible를 활용한 Zabbix 에이전트를 배포하는 방법에 대해 알아보았는데요. Ansible과 같은 자동화 도구를 이용하여 배포하면 일일이 각각의 서버에 접속하여 작업할 필요 없이 한 번에 대규모 환경에 적용이 가능하며, 시간과 자원을 쉽게 절약할 수 있습니다.

이 외에도 Zabbix 도입/구축/유지 관리에 대해 궁금하신 점이 있으시다면 언제든 디무브를 찾아주세요! 디무브는 Zabbix의 공식 파트너이자, 공인 교육 파트너입니다.