2019年3月20日水曜日

ZabbixのDBの中身のデータを直接SQLで取得する方法

Zabbixは取得したデータをグラフで出力させる機能は充実しているが、CSV等で一覧出力する機能があまり充実しておらず、必然的にスクリプトなどで作りこみを行うことになる。
今回、ZabbixのDBからCPU使用率やメモリ使用率といったパフォーマンスデータをスクリプトなどで自動エクスポートできるよう、DBの内容調査を行い、データ抽出のためのSQL文を作ってみることにした。

Zabbix環境

  • OS : CentOS
  • Zabbix : Zabbix 4.0
  • DB : MariaDB

ZabbixのDB構造を確認する

まずは、ZabbixのDBの後続を把握するため、存在するテーブルを確認し、個々のテーブルの中身を確認してみることにする。

DB内のテーブル一覧を確認

MariaDBにログインして、Zabbixのテーブル一覧を確認してみる。どうやらZabbix 4.0では、144個のテーブルが存在するようだ。
MariaDB [zabbix]> show tables;
+----------------------------+
| Tables_in_zabbix           |
+----------------------------+
| acknowledges               |
| actions                    |
| alerts                     |

~(中略)~

| valuemaps                  |
| widget                     |
| widget_field               |
+----------------------------+
144 rows in set (0.00 sec)

登録されているホスト一覧を確認

Zabbixに登録されているホストは「hosts」テーブルに存在する。テンプレートもホストとして登録されており、後半に実際の監視対象としてのホストが表示される。
MariaDB [zabbix]> select hostid, host from hosts;
+--------+-------------------------------------------------------------------------------+
| hostid | host                                                                          |
+--------+-------------------------------------------------------------------------------+
|  10168 | Template App Apache Tomcat JMX                                                |
|  10093 | Template App FTP Service                                                      |
|  10169 | Template App Generic Java JMX                                                 |

~(中略)~

|  10262 | t1081w219                                                                     |
|  10260 | t1082w216                                                                     |
|  10176 | {#HV.UUID}                                                                    |
|  10177 | {#VM.UUID}                                                                    |
+--------+-------------------------------------------------------------------------------+
今回はホスト名「t1081w219」(hostid=10262)を対象に確認を進めることにする。

アイテム一覧を確認

アイテムは「items」テーブルに登録されている。アイテムは一覧取得すると大量に出力されるため、とりあえず存在するカラムを確認しておく。
MariaDB [zabbix]> show columns from items;
+-----------------------+---------------------+------+-----+---------+-------+
| Field                 | Type                | Null | Key | Default | Extra |
+-----------------------+---------------------+------+-----+---------+-------+
| itemid                | bigint(20) unsigned | NO   | PRI | NULL    |       |
| type                  | int(11)             | NO   |     | 0       |       |
| snmp_community        | varchar(64)         | NO   |     |         |       |
| snmp_oid              | varchar(512)        | NO   |     |         |       |
| hostid                | bigint(20) unsigned | NO   | MUL | NULL    |       |

~(中略)~

| verify_peer           | int(11)             | NO   |     | 0       |       |
| verify_host           | int(11)             | NO   |     | 0       |       |
| allow_traps           | int(11)             | NO   |     | 0       |       |
+-----------------------+---------------------+------+-----+---------+-------+
63 rows in set (0.00 sec)
ホスト名「t1081w219」のアイテム一覧を確認する。
MariaDB [zabbix]> select itemid, hostid, name,key_ from items where hostid='10262';
+--------+--------+------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| itemid | hostid | name                               | key_                                                                                                                                      |
+--------+--------+------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
|  28658 |  10262 | Host name of zabbix_agentd running | agent.hostname                                                                                                                            |
|  28659 |  10262 | Agent ping                         | agent.ping                                                                                                                                |
|  28660 |  10262 | Version of zabbix_agent(d) running | agent.version                                                                                                                             |

~(中略)~

|  28671 |  10262 | Processor load (15 min average)    | system.cpu.load[percpu,avg15]                                                                                                             |
|  28672 |  10262 | Processor load (1 min average)     | system.cpu.load[percpu,avg1]                                                                                                              |
|  28673 |  10262 | Processor load (5 min average)     | system.cpu.load[percpu,avg5]                                                                                                              |
|  28674 |  10262 | Free swap space                    | system.swap.size[,free]                                                                                                                   |
|  28675 |  10262 | Total swap space                   | system.swap.size[,total]                                                                                                                  |
|  28676 |  10262 | System information                 | system.uname                                                                                                                              |
|  28677 |  10262 | System uptime                      | system.uptime                                                                                                                             |
|  28657 |  10262 | Mounted filesystem discovery       | vfs.fs.discovery                                                                                                                          |
|  28741 |  10262 | Free disk space on $1              | vfs.fs.size[C:,free]                                                                                                                      |
|  28742 |  10262 | Free disk space on $1 (percentage) | vfs.fs.size[C:,pfree]                                                                                                                     |
|  28743 |  10262 | Total disk space on $1             | vfs.fs.size[C:,total]                                                                                                                     |
|  28744 |  10262 | Used disk space on $1              | vfs.fs.size[C:,used]                                                                                                                      |
|  28683 |  10262 | Free disk space on $1              | vfs.fs.size[{#FSNAME},free]                                                                                                               |
|  28684 |  10262 | Free disk space on $1 (percentage) | vfs.fs.size[{#FSNAME},pfree]                                                                                                              |
|  28685 |  10262 | Total disk space on $1             | vfs.fs.size[{#FSNAME},total]                                                                                                              |
|  28686 |  10262 | Used disk space on $1              | vfs.fs.size[{#FSNAME},used]                                                                                                               |
|  28678 |  10262 | Free memory                        | vm.memory.size[free]                                                                                                                      |
|  28679 |  10262 | Total memory                       | vm.memory.size[total]                                                                                                                     |
|  28680 |  10262 | Free virtual memory, in %          | vm.vmemory.size[pavailable]                                                                                                               |
+--------+--------+------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
89 rows in set (0.00 sec)
今回は、「Processor load (5 min average)」(itemid=28673)を取得するSQL文を作成していくことにする。

ヒストリを確認

各ホストのパフォーマンスデータは「history」テーブルに保存されている。このテーブルのカラムはシンプルに4つとなっている。
MariaDB [zabbix]> show columns from history;
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| itemid | bigint(20) unsigned | NO   | MUL | NULL    |       |
| clock  | int(11)             | NO   |     | 0       |       |
| value  | double(16,4)        | NO   |     | 0.0000  |       |
| ns     | int(11)             | NO   |     | 0       |       |
+--------+---------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

特定の日付のパフォーマンスデータを出力する

ひねりのないSQL文

DBのテーブル構成の確認ができたので、historyテーブルから以下内容のパフォーマンスデータをひねりのない単純なSQL文で出力してみる。
  • 取得対象アイテム : Processor load (5 min average) (itemid=28673)
  • 取得開始日時 : 2018-10-08 00:00:00
  • 取得終了日時 : 2018-10-09 00:00:00
以下結果では、出力が21:49からになっているが、これは対象ホストのデータ取得開始が21:49からだっただけで、データが存在すれば00:00からのデータが取得される。
MariaDB [zabbix]> select from_unixtime(clock), value from history where itemid='28673' and from_unixtime(clock) between '2018-10-08 00:00:00' and '2018-10-09 00:00:00';
+----------------------+--------+
| from_unixtime(clock) | value  |
+----------------------+--------+
| 2018-10-08 21:49:53  | 0.0093 |
| 2018-10-08 21:50:53  | 0.0111 |
| 2018-10-08 21:51:53  | 0.0100 |
| 2018-10-08 21:52:53  | 0.0128 |
| 2018-10-08 21:53:53  | 0.0128 |
| 2018-10-08 21:54:53  | 0.0122 |
| 2018-10-08 21:55:53  | 0.0144 |
| 2018-10-08 21:56:53  | 0.0128 |
| 2018-10-08 21:57:53  | 0.0100 |

~(中略)~

| 2018-10-08 23:55:53  | 0.0000 |
| 2018-10-08 23:56:53  | 0.0000 |
| 2018-10-08 23:57:53  | 0.0000 |
| 2018-10-08 23:58:53  | 0.0000 |
| 2018-10-08 23:59:53  | 0.0000 |
+----------------------+--------+
111 rows in set (0.00 sec)

テーブルを結合して出力するSQL文

「ひねりのないSQL文」では、事前にhostidやitemidを調べておく必要があり、実用的ではない。そこで、INNER JOIN句を使いテーブルを内部結合することで、hostidやitemidを調べることなく「ホスト名」や「アイテム名」そのものを条件としてデータ出力できるようにしてみた。
MariaDB [zabbix]> select from_unixtime(history.clock), hosts.host, items.name, history.value from history
    ->  inner join items using( itemid )
    ->  inner join hosts using( hostid )
    ->  where hosts.host='t1081w219' and items.name='Processor load (5 min average)' and from_unixtime(clock) between '2019-01-02 00:00:00' and '2019-01-03 00:00:00';
+------------------------------+-----------+--------------------------------+--------+
| from_unixtime(history.clock) | host      | name                           | value  |
+------------------------------+-----------+--------------------------------+--------+
| 2018-10-08 21:49:53          | t1081w219 | Processor load (5 min average) | 0.0093 |
| 2018-10-08 21:50:53          | t1081w219 | Processor load (5 min average) | 0.0111 |
| 2018-10-08 21:51:53          | t1081w219 | Processor load (5 min average) | 0.0100 |

~(中略)~

| 2018-10-08 23:57:53          | t1081w219 | Processor load (5 min average) | 0.0000 |
| 2018-10-08 23:58:53          | t1081w219 | Processor load (5 min average) | 0.0000 |
| 2018-10-08 23:59:53          | t1081w219 | Processor load (5 min average) | 0.0000 |
+------------------------------+-----------+--------------------------------+--------+
111 rows in set (0.00 sec)
上記の通り、「ひねりのないSQL文」と同一結果が出力できた。

CSVで出力する

最後に出力したデータをCSVでファイル出力する。INTO OUTFILE句にて出力ファイル名を指定し、「,」区切り指定をすればよい。
MariaDB [zabbix]> select from_unixtime(history.clock), hosts.host, items.name, history.value from history
    ->  inner join items using( itemid )
    ->  inner join hosts using( hostid )
    ->  where hosts.host='Zabbix server' and items.name='CPU user time' and from_unixtime(clock) between '2019-01-02 00:00:00' and '2019-01-03 00:00:00'
    ->  into outfile 'zabbix_history_data.csv' fields terminated by ',';
ファイルの出力先は以下となる。
# ls -l /var/lib/mysql/zabbix/ | grep csv
-rw-rw-rw- 1 mysql mysql 79200  1月  6 15:04 zabbix_history_data.csv
2019年3月13日水曜日

ONTAP 9.4でGUIとCLIの自動タイムアウトを無効にする

NetApp社のストレージOSであるONTAPでは、「OnCommand System Manager」によるWebによるGUI操作と、SSHによるCLI操作にて管理が可能となっている。これらの管理画面は、特に操作が行われないと自動でタイムアウトする設定が入っているが、構築時や検証時などは、自動でタイムアウトされない方が都合がよいことも多いため、本タイムアウトの機能を無効にしてみた。

環境

  • ONTAP 9.4

OnCommand System Manager

OnCommand System Managerは、右上の歯車マークのアイコンを選択する。
その後、「全般」→「非アクティブ時のタイムアウト(分)」の値を0に設定して保存すれば、自動でタイムアウトすることはなくなる。



CLI

CLIのタイムアウトはsystemm timeoutコマンドで確認と変更が可能となる。変更前の設定を確認すると、デフォルトは30分でタイムアウトすることがわかる。
cluster1::> system timeout show
CLI session timeout: 30 minutes
タイムアウトを無期限に変更する場合は、タイムアウト値を0に設定すればよい。
cluster1::> system timeout modify -timeout 0
設定後タイムアウト値を確認すると0分となっており、自動でタイムアウトされることがなくなる。
cluster1::> system timeout show
CLI session timeout: 0 minutes
2019年3月6日水曜日

【PowerShell】Windowsのネットワークの設定を行う

Windows Serverをインストールした際に、避けて通れないネットワーク設定であるが、GUIでポチポチ設定するのも面倒なので、PowerShellを使ってコマンドで実施する方法を調べてみた。

NICのIPv6をOFFにする

WindowsのNICはデフォルトでIPv6が利用できるように設定されているが、IPv6は利用する機会はほとんどないので無効化しておく。

まずは、現在のNICの設定状態を確認してみよう。Get-NetAdapterBindingコマンドレットで確認できる。ここで表示される値は、GUIでいうとネットワークアダプターのプロパティの画面と同じになる。
PS C:\> Get-NetAdapterBinding |  Where-Object {$_.Name -eq "Ethernet2"}

Name                           DisplayName                                        ComponentID          Enabled
----                           -----------                                        -----------          -------
Ethernet2                      Microsoft LLDP プロトコル ドライバー               ms_lldp              True
Ethernet2                      Microsoft ネットワーク用ファイルとプリンター共有   ms_server            True
Ethernet2                      インターネット プロトコル バージョン 4 (TCP/IPv4)  ms_tcpip             True
Ethernet2                      Microsoft ネットワーク用クライアント               ms_msclient          True
Ethernet2                      Microsoft Network Adapter Multiplexor Protocol     ms_implat            False
Ethernet2                      Link-Layer Topology Discovery Responder            ms_rspndr            True
Ethernet2                      インターネット プロトコル バージョン 6 (TCP/IPv6)  ms_tcpip6            True
Ethernet2                      Hyper-V Extensible Virtual Switch                  vms_pp               False
Ethernet2                      Link-Layer Topology Discovery Mapper I/O Driver    ms_lltdio            True
Ethernet2                      QoS パケット スケジューラ                          ms_pacer             True
設定変更はSet-NetAdapterBindingコマンドレットで行う。今回は「Ethernet2」の「ms_tcpip6」を無効化する。
PS C:\> Set-NetAdapterBinding -Name "Ethernet2" -ComponentID "ms_tcpip6" -Enable $false
設定後の確認を行うと、「インターネット プロトコル バージョン 6 (TCP/IPv6)」が「False」になっていることがわかる。
PS C:\> Get-NetAdapterBinding |  Where-Object {$_.Name -eq "Ethernet2"}

Name                           DisplayName                                        ComponentID          Enabled
----                           -----------                                        -----------          -------
Ethernet2                      Microsoft LLDP プロトコル ドライバー               ms_lldp              True
Ethernet2                      Microsoft ネットワーク用ファイルとプリンター共有   ms_server            True
Ethernet2                      インターネット プロトコル バージョン 4 (TCP/IPv4)  ms_tcpip             True
Ethernet2                      Microsoft ネットワーク用クライアント               ms_msclient          True
Ethernet2                      Microsoft Network Adapter Multiplexor Protocol     ms_implat            False
Ethernet2                      Link-Layer Topology Discovery Responder            ms_rspndr            True
Ethernet2                      インターネット プロトコル バージョン 6 (TCP/IPv6)  ms_tcpip6            False
Ethernet2                      Hyper-V Extensible Virtual Switch                  vms_pp               False
Ethernet2                      Link-Layer Topology Discovery Mapper I/O Driver    ms_lltdio            True
Ethernet2                      QoS パケット スケジューラ                          ms_pacer             True

NICに固定IPアドレスを付与する

NICに固定IPアドレスを設定する前に、インターフェースの名前を確認しよう。インターフェース一覧はGet-NetAdapterコマンドレットで確認できる。今回は「Ethernet2」を対象に設定変更を行うことにする。
PS C:\> Get-NetAdapter | Sort-Object Name

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
Ethernet0                 Intel(R) 82574L Gigabit Network Conn...      16 Up           00-0C-29-AF-24-83         1 Gbps
Ethernet1                 Intel(R) 82574L Gigabit Network Co...#2       4 Up           00-0C-29-AF-24-8D         1 Gbps
Ethernet2                 Intel(R) 82574L Gigabit Network Co...#3      37 Up           00-0C-29-AF-24-97         1 Gbps
vEthernet (Intel(R) 82... Hyper-V Virtual Ethernet Adapter              9 Up           00-0C-29-AF-24-83         1 Gbps
続けて、インターフェースに設定されているIPアドレスをGet-NetIPAddressコマンドレットにて確認する。
PS C:\> Get-NetIPAddress |ft InterfaceAlias, IPAddress,PrefixLength

InterfaceAlias                                                          IPAddress                    PrefixLength
--------------                                                          ---------                    ------------
Ethernet2                                                               fe80::c57b:1420:969:f48b%37            64
vEthernet (Intel(R) 82574L Gigabit Network Connection - Virtual Switch) fe80::c19f:f1cb:d7ca:df6%9             64
ローカル エリア接続* 10                                                 fe80::155e:acfe:8b10:d8ab%12           64
Ethernet1                                                               fe80::7c63:ecf4:628:44e4%4             64
Loopback Pseudo-Interface 1                                             ::1                                   128
Ethernet2                                                               169.254.244.139                        16
vEthernet (Intel(R) 82574L Gigabit Network Connection - Virtual Switch) 192.168.11.111                         24
ローカル エリア接続* 10                                                 169.254.2.65                           16
Ethernet1                                                               192.168.55.111                         24
Loopback Pseudo-Interface 1                                             127.0.0.1                               8
それではIPアドレスを設定してみよう。IPアドレスはNew-NetIPAddressコマンドレットで設定可能となる。-DefaultGatewayオプションを付けることでデフォルトゲートウェイの設定も可能。ただし、デフォルトゲートウェイはサーバ内で1つしか設定できないため、本コマンドでデフォルトゲートウェイを設定した場合、すでに設定済みデフォルトゲートウェイの設定がある場合は消えてしまうので注意すること。

「Ethernet2」のアダプターに対して、「192.168.77.111/24」でデフォルトゲートウェイを「192.168.77.31」に設定してみた。
PS C:\> New-NetIPAddress -IPAddress "192.168.77.111" -InterfaceAlias "Ethernet2" -DefaultGateway "192.168.77.31" -PrefixLength 24


IPAddress         : 192.168.77.111
InterfaceIndex    : 37
InterfaceAlias    : Ethernet2
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 24
PrefixOrigin      : Manual
SuffixOrigin      : Manual
AddressState      : Tentative
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False
PolicyStore       : ActiveStore

IPAddress         : 192.168.77.111
InterfaceIndex    : 37
InterfaceAlias    : Ethernet2
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 24
PrefixOrigin      : Manual
SuffixOrigin      : Manual
AddressState      : Invalid
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False
PolicyStore       : PersistentStore
設定を元に戻す場合は、デフォルトのDHCPに変更すればよい。
Set-NetIPInterface -InterfaceAlias "Ethernet2" -Dhcp Enable

NICの有効化・無効化

NICの有効化はEnable-NetAdapterコマンドレットで行うことができる。
PS C:\> Enable-NetAdapter -Name "Ethernet2"
NICの無効化はDisable-NetAdapterコマンドレットで行うことができる。
PS C:\> Disable-NetAdapter -Name "Ethernet2"

確認
この操作を実行しますか?
Disable-NetAdapter 'Ethernet2'
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y
確認が不要な場合は-Confirm $falseをオプションとして付与すればよい。
PS C:\> Disable-NetAdapter -Name "Ethernet2" -Confirm $false

人気の投稿