Zabbix Windowsエージェントのリモートインストール

# 目的
ZabbixのWindowsエージェントはインストーラー付きのものがサードパーティから提供されていますが、台数が多いとインストーラに従ってポチポチするのは非常に面倒です。
またzabbix_agentd.exeのオプション「－i」を使えばコマンドでwindowsサービスに登録することが出来ますが実機にログインして実行する必要があるので、それ以外にリモートから纏めて複数台にインストールする方法は無いか考えてみました。

# 方針
サードパーティのインストーラもzabbix_agentd.exeのオプション「－i」もWindowsサービスに登録を行っているだけでそれ以外にレジストリは一切使用していません。
そのためscコマンドを使用してリモートからWindowsサービスへ登録してみます。

> 参考　Sc.exe を使用してWindowsサービスを作成する方法
> http://support2.microsoft.com/kb/251192/ja

# 前提
作業マシンとリモートホストで同じアカウント(要Admin権限）があること。MS-RPCを使います。
またファイルコピーのために管理共有が使えることが必要です。

# 手順
1．ソースコード一式をダウンロード・解凍し、コンパイルされたWindows用バイナリが含まれているので取り出します。
（zabbix-2.X.X/bin/win64　or　zabbix-2.X.X/bin/win32 の中）

2．管理共有を使ってリモートホストにフォルダを作成。exeファイルとzabbix_agentd.confをコピー

3．scコマンドでサービスへ登録
```
sc \\192.168.0.1 create "ZABBIX Agent" binPath= """"C:\Program Files\ZABBIX Agent\zabbix_agentd.exe""" --config """C:\Program Files\ZABBIX Agent\zabbix_agentd.conf""""
```
※　「"」の位置と個数に注意です。


# サンプルバッチファイル
実際には複数台に纏めて実行するためバッチを作成してインストール、アップデートを行えるようにしました。

```lang:ファイル配置
ZABBIX_AGENTD　※作業マシンの適当な所に作成
│  hostlist.txt
│  ZabbixAgentInstall.bat
│  zabbix_agent.userparams.conf　※バッチ内で動的に作成
│  zabbix_agentd.conf
│
└─2.0.12　　　　※バッチ内の「AGENT_VER」と合わせる
　　├─win32
　　│　　　zabbix_agentd.exe
　　│　　　zabbix_get.exe
　　│　　　zabbix_sender.exe
　　│
　　└─win64
　　　　　　zabbix_agentd.exe
　　　　　　zabbix_get.exe
　　　　　　zabbix_sender.exe
```

```lang:hostlist.txt
ここに記載したリストに従って処理させます。32bit/64bit混在環境も想定しました。

;空白行禁止
;IPアドレス△ホスト名△エージェント種類(win32/win64)
;=============================================
192.168.0.1 hogehoge01 win32
192.168.0.2 hogehoge02 win64
　　　　　～～～～～～～～～～～～
```
```lang:zabbix_agentd.conf
「zabbix_agent.userparams.conf」へバッチ内で動的に「Hostname」パラメータを書き込み転送します。
そのため、それを読み込むよう「Include」パラメータを書いておきます。

Include=C:\Program Files\ZABBIX Agent\zabbix_agent.userparams.conf
```

```bat:ZabbixAgentInstall.bat
@echo off
setlocal enabledelayedexpansion
COLOR 1F

rem #### Configuration ##########################

set AGENT_VER=2.0.12
set INST_FOLDER=zabbix
set SERVICE_NAME="ZABBIX Agent"

rem #############################################
:CHECK
CALL :TITLE
set CHECK= 
echo   1．開始
echo   2．停止
echo   3．動作状況確認
echo   4．インストール/バージョンアップ　！注意！ 事前にAgent停止が必要
echo   5．サービス登録
echo   6．サービス削除　　　！注意！ 事前にAgent停止が必要
echo   7．コンフィグコピー　※コンフィグだけ変更時使用

echo+
set/P CHECK="Input No[1－7] 『Q:中止』:"

IF /i !CHECK! == 1 GOTO start
IF /i !CHECK! == 2 GOTO stop
IF /i !CHECK! == 3 GOTO status
IF /i !CHECK! == 4 GOTO filecopy
IF /i !CHECK! == 5 GOTO serviceadd
IF /i !CHECK! == 6 GOTO servicedel
IF /i !CHECK! == 7 GOTO confcopy

IF /i !CHECK! == Q GOTO end2

GOTO CHECK
rem #############################################
:start
For /F "eol=; tokens=1,2" %%i in (%~dp0hostlist.txt) Do Call :SUB_start %%i %%j
GOTO end

:SUB_start
echo ===== %1 [%2] ======
sc \\%1 start %SERVICE_NAME%
exit /B
rem #############################################
:stop
For /F "eol=; tokens=1,2" %%i in (%~dp0hostlist.txt) Do Call :SUB_stop %%i %%j
GOTO end

:SUB_stop
echo ===== %1 [%2] ======
sc \\%1 stop %SERVICE_NAME%
exit /B
rem #############################################
:status
For /F "eol=; tokens=1,2" %%i in (%~dp0hostlist.txt) Do Call :SUB_status %%i %%j
GOTO end

:SUB_status
echo ===== %1 [%2] ======
sc \\%1 query %SERVICE_NAME% | findstr STATE
exit /B
rem #############################################
:filecopy
For /F "eol=; tokens=1,2,3" %%i in (%~dp0hostlist.txt) Do Call :SUB_filecopy %%i %%j %%k
GOTO end

:SUB_filecopy
echo ===== %1 [%2] ======
set ORIGINFILE=%~dp0%AGENT_VER%
set CONFIGFILE=%~dp0zabbix_agentd.conf
set SENDPATH="\\%1\c$\Program Files\%INST_FOLDER%\"
mkdir %SENDPATH%

xcopy /Y %ORIGINFILE%\%3\* %SENDPATH%

echo Hostname=%2>%~dp0zabbix_agent.userparams.conf
xcopy /Y %CONFIGFILE% %SENDPATH%
xcopy /Y %~dp0zabbix_agent.userparams.conf %SENDPATH%

exit /B
rem #############################################
:serviceadd
For /F "eol=; tokens=1,2" %%i in (%~dp0hostlist.txt) Do Call :SUB_serviceadd %%i %%j
GOTO end

:SUB_serviceadd
echo ===== %1 [%2] ======
sc \\%1 create %SERVICE_NAME% binPath= """"C:\Program Files\%INST_FOLDER%\zabbix_agentd.exe""" --config """C:\Program Files\%INST_FOLDER%\zabbix_agentd.conf""""
sc \\%1 config %SERVICE_NAME% start= auto
exit /B
rem #############################################
:servicedel
For /F "eol=; tokens=1,2" %%i in (%~dp0hostlist.txt) Do Call :SUB_serviceadd %%i %%j
GOTO end

:SUB_serviceadd
echo ===== %1 [%2] ======
sc \\%1 delete %SERVICE_NAME%
exit /B
rem #############################################
:confcopy
For /F "eol=; tokens=1,2" %%i in (%~dp0hostlist.txt) Do Call :SUB_confcopy %%i %%j
GOTO end

:SUB_confcopy
echo ===== %1 [%2] ======
set CONFIGFILE=%~dp0zabbix_agentd.conf
set SENDPATH="\\%1\c$\Program Files\%INST_FOLDER%\"

echo Hostname=%2>%~dp0zabbix_agent.userparams.conf

xcopy /Y %CONFIGFILE% %SENDPATH%
xcopy /Y %~dp0zabbix_agent.userparams.conf %SENDPATH%

exit /B
rem #############################################

:end
pause
GOTO CHECK

:end2
exit

:TITLE
cls
echo  ######################################################################
echo  #            Zabbix Agent(Windows)  インストールツール
echo  ######################################################################
echo+
echo+

exit /B
```
# 実行画面
「4.」のインストール・バージョンアップはフォルダの作成、exe/コンフィグの転送までなので、
初回は「5．」のサービス登録も合わせて実行が必要です。

![install.png](https://qiita-image-store.s3.amazonaws.com/0/54952/8738f078-1879-23af-b6d4-ad80261daef8.png)