とあるシステムの中の人

プログラミング、育児、武道、3Dグラフィック、ゲーム開発

zabbixをansibleで設定する(2) - mail発報する -

zabbixをansibleで設定する(2) - mail発報する -

  • zabbixを使った監視でmail発報させるまでの手順をまとめます。
  • 設定はansibleで実装します。
  • zabbixはインストール直後、初期設定はすませているものとします。

設定の段取り

  • 設定としては、以下のような感じになります。
  • 監視内容を決定します。今回はpingによる生死監視とします。
  • 監視の内容をitemとして定義します。
  • 発報の条件をtrigerとして定義します。
  • itemtrigerの内容でtemplateを定義します。
  • templateをansibleでzabbixに適用します。
  • host_groupを登録します。
  • 監視対象をhostとして、ansibleでzabbixに適用します。この時、事前に設定したhost_groupに所属させます。
  • Media typesをansibleでzabbixに適用します。この時、送信メールアドレスのSMTPサーバー等を設定します。
  • 監視時に発報するUsersをansibleで適用します。この時、メール発報するMedia typesを指定します。
  • trigerで検知した際に発報するユーザーをTrigger actionsで登録します。

監視の内容をitemとして、発報の条件をtrigerとして定義

  • 以下のように定義します。
  • 手作業でjsonファイルを記述するのは大変なので、WEBインターフェースで定義したものをエクスポートし、雛形とすると楽です。
                "items": [                        
                    {                                     
                        "uuid": "49d5b82ce05446439dda6a1319b9f357",
                        "name": "ping",                                                            
                        "type": "SIMPLE",                              
                        "key": "icmpping",                               
                        "delay": "3s",                                    
                        "triggers": [                                 
                            {                                        
                                "uuid": "c57b2a8f635b41439a0fa3669a803a75",
                                "expression": "last(/testtest/icmpping,#1)=0",                             
                                "name": "pingcheck",                                                          
                                "priority": "HIGH"                                  
                            }                                                     
                        ]                                    
                    }                                    
                ]

itemtrigerの内容でtemplateを定義

  • 以下のように定義します。
{
    "zabbix_export": {
        "version": "6.0",
        "date": "2024-01-07T02:05:29Z",
        "groups": [
            {
                "uuid": "846977d1dfed4968bc5f8bdb363285bc",
                "name": "Templates/Operating systems"
            }
        ],
        "templates": [
            {
                "uuid": "f8f7908280354f2abeed07dc788c3747",
                "template": "testtest",
                "name": "test",
                "description": "Official Linux template. Requires agent of Zabbix 6.0 or newer.\n      \nYou can discuss this template or leave feedback on our forum https://www.zabbix.com/forum/zabbix-suggestions-and-feedback/387225-discussion-thread-for-official-zabbix-template-for-linux\n\nGenerated by official Zabbix template tool \"Templator\"",
                "groups": [
                    {
                        "name": "Templates/Operating systems"
                    }
                ],
                "items": [
            {
                        "uuid": "49d5b82ce05446439dda6a1319b9f357",
                        "name": "ping",
                        "type": "SIMPLE",
                        "key": "icmpping",
                        "delay": "3s",
                        "triggers": [
                            {
                                "uuid": "c57b2a8f635b41439a0fa3669a803a75",
                                "expression": "last(/testtest/icmpping,#1)=0",
                                "name": "pingcheck",
                                "priority": "HIGH"
                            }
                        ]
                    }
                ]
            }
        ]
    }
}
  • これをansibleで適用するには以下のようにtaskを構成して適用します。
  • community.zabbix.zabbix_templateモジュールを使います。lookupを使用してjsonファイルを探します。
- name: Import templates from JSON
  community.zabbix.zabbix_template:
    template_json: "{{ lookup('file', 'template.json') }}"
    state: present
  • 以下のplaybookで適用します。
---
- hosts: all
  gather_facts: no
  roles:
    - zabbix_setting
  • 実行します
(zabbix_setting) ttmp@ttmp-virtual-machine:~/dev/zabbix_setting$ ansible-playbook -i hosts pb.yml --limit kanshi2 -K
BECOME password: 

PLAY [all] **************************************************************************************************************************

TASK [zabbix_setting : Import templates from JSON] **********************************************************************************
changed: [kanshi2]

PLAY RECAP **************************************************************************************************************************
kanshi2                    : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

(zabbix_setting) ttmp@ttmp-virtual-machine:~/dev/zabbix_setting$ 
  • 適用されました。

host_groupの登録

  • host_groupcommunity.zabbix.zabbix_groupを使います。
  • 以下にコードを記載します。
- name: add_hostgroup                                
  community.zabbix.zabbix_group:
    state: present
    host_groups: "testgrp"
  • 実行します。
(zabbix_setting) ttmp@ttmp-virtual-machine:~/dev/zabbix_setting$ ansible-playbook -i hosts pb.yml --limit kanshi2 -K
BECOME password: 

PLAY [all] **************************************************************************************************************************

TASK [zabbix_setting : Import templates from JSON] **********************************************************************************
changed: [kanshi2]

TASK [zabbix_setting : add_hostgroup] ***********************************************************************************************
changed: [kanshi2]

PLAY RECAP **************************************************************************************************************************
kanshi2                    : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

(zabbix_setting) ttmp@ttmp-virtual-machine:~/dev/zabbix_setting$ 
  • 適用されました。

監視対象をhostを登録

  • 事前に設定したhost_groupに所属させます。
  • また事前に作成したtenmplateをリンクさせます。
- name: Create a new host or rewrite an existing host's info
  community.zabbix.zabbix_host:
    host_name: ExampleHost
    visible_name: ExampleName
    description: My ExampleHost Description
    host_groups:
      - "testgrp"  
    link_templates:
      - "testtest"
    status: enabled
    state: present
    interfaces:
      - type: 1
        main: 1
        useip: 1
        ip: 192.168.11.47
        dns: ""
        port: "10050"
  • 適用します。
(zabbix_setting) ttmp@ttmp-virtual-machine:~/dev/zabbix_setting$ ansible-playbook -i hosts pb.yml --limit kanshi2 -K
BECOME password: 

PLAY [all] **************************************************************************************************************************

TASK [zabbix_setting : Import templates from JSON] **********************************************************************************
changed: [kanshi2]

TASK [zabbix_setting : add_hostgroup] ***********************************************************************************************
ok: [kanshi2]

TASK [zabbix_setting : Create a new host or rewrite an existing host's info] ********************************************************
changed: [kanshi2]

PLAY RECAP **************************************************************************************************************************
kanshi2                    : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

(zabbix_setting) ttmp@ttmp-virtual-machine:~/dev/zabbix_setting$ 
  • 登録されました。

Media typesの適用

  • 送信メールアドレスのSMTPサーバー等を設定します。
- name: "Create an email mediatype with SMTP authentication"
  # set task level variables as we change ansible_connection plugin here
  community.zabbix.zabbix_mediatype:
    name: "Ops email"
    type: "email"
    smtp_server: "example.com"
    smtp_server_port: 2000
    smtp_email: "ops@example.com"
    smtp_authentication: true
      smtp_security: STARTTLS
    username: "smtp_user"
    password: "smtp_pass"
  • 上記は適当な値を入れていますが、実際にはメール送信可能な情報を記述します。また、パスワードなどの情報はvaultに保存すべきです。
  • 実行します。
(zabbix_setting) ttmp@ttmp-virtual-machine:~/dev/zabbix_setting$ ansible-playbook -i hosts pb.yml --limit kanshi2 -K
BECOME password: 

PLAY [all] **************************************************************************************************************************

TASK [zabbix_setting : Import templates from JSON] **********************************************************************************
changed: [kanshi2]

TASK [zabbix_setting : add_hostgroup] ***********************************************************************************************
ok: [kanshi2]

TASK [zabbix_setting : Create a new host or rewrite an existing host's info] ********************************************************
ok: [kanshi2]

TASK [zabbix_setting : Create an email mediatype with SMTP authentication] **********************************************************
changed: [kanshi2]

PLAY RECAP **************************************************************************************************************************
kanshi2                    : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

(zabbix_setting) ttmp@ttmp-virtual-machine:~/dev/zabbix_setting$ 
  • 適用されました。
  • テストしてみると良いでしょう。メール送信の単体確認ができます。

監視時に発報するUsersを適用

  • メール発報するMedia typesを指定します。
  • community.zabbix.zabbix_userを使用します。
- name: create a new zabbix user.
  community.zabbix.zabbix_user:
    username: Admin2
    name: Zabbix2
    surname: Administrator2
    usrgrps:
      - Zabbix administrators
    passwd: zabbixzabbix
    lang: default
    theme: default
    autologin: "1"
    autologout: "0"
    refresh: "30s"
    rows_per_page: "200"
    user_medias:
      - mediatype: Ops email
        sendto:
          - example@example.com
          - example1@example.com
        period: 1-7,00:00-24:00
        severity:
          not_classified: no
          information: yes
          warning: yes
          average: yes
          high: yes
          disaster: yes
        active: yes
    state: present
  • 実行します。
(zabbix_setting) ttmp@ttmp-virtual-machine:~/dev/zabbix_setting$ ansible-playbook -i hosts pb.yml --limit kanshi2 -K
BECOME password: 

PLAY [all] **************************************************************************************************************************

TASK [zabbix_setting : Import templates from JSON] **********************************************************************************
changed: [kanshi2]

TASK [zabbix_setting : add_hostgroup] ***********************************************************************************************
ok: [kanshi2]

TASK [zabbix_setting : Create a new host or rewrite an existing host's info] ********************************************************
ok: [kanshi2]

TASK [zabbix_setting : Create an email mediatype with SMTP authentication] **********************************************************
ok: [kanshi2]

TASK [zabbix_setting : create a new zabbix user.] ***********************************************************************************
changed: [kanshi2]

PLAY RECAP **************************************************************************************************************************
kanshi2                    : ok=5    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

(zabbix_setting) ttmp@ttmp-virtual-machine:~/dev/zabbix_setting$ 
  • 適用されました。
  • media typeも設定されました。

trigerで検知した際に発報するユーザーをTrigger actionsで登録

  • 以下のようにtrigger_severityhighの時に発砲するようにしてみます。
- name: Deploy trigger action
  community.zabbix.zabbix_action:
    name: "Send alerts to Admin"
    event_source: "trigger"
    state: present
    status: enabled
    esc_period: 60
    conditions:
      - type: "trigger_severity"
        operator: "equals"        
        value: "high"              
    operations:
      - type: send_message
        subject: "Something bad is happening"
        op_message: "Come on, guys do something"
        media_type: "Ops email"
        send_to_users:
          - "Admin2"
  • 実行します
(zabbix_setting) ttmp@ttmp-virtual-machine:~/dev/zabbix_setting$ ansible-playbook -i hosts pb.yml --limit kanshi2 -K
BECOME password: 

PLAY [all] **************************************************************************************************************************

TASK [zabbix_setting : Import templates from JSON] **********************************************************************************
changed: [kanshi2]

TASK [zabbix_setting : add_hostgroup] ***********************************************************************************************
ok: [kanshi2]

TASK [zabbix_setting : Create a new host or rewrite an existing host's info] ********************************************************
ok: [kanshi2]

TASK [zabbix_setting : Create an email mediatype with SMTP authentication] **********************************************************
ok: [kanshi2]

TASK [zabbix_setting : create a new zabbix user.] ***********************************************************************************
ok: [kanshi2]

TASK [zabbix_setting : Deploy trigger action] ***************************************************************************************
changed: [kanshi2]

PLAY RECAP **************************************************************************************************************************
kanshi2                    : ok=6    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

(zabbix_setting) ttmp@ttmp-virtual-machine:~/dev/zabbix_setting$ 
  • 適用されました。
  • 発報してみます。
  • actionが起動しました。
  • メールも送信されました。