Systems Manager Distributor によるZabbixAgent 配布管理

11月20日に公開されたSystems Manager Distributor を利用してZabbixAgentを配布したいと思います。

#Systems Manager Distributor とは
AWS Systems Manager Distributor の新機能です。
Systems Manager の管理対象となっているマネージドインスタンスに対してパッケージ化されたソフトウェアを配布することができます。

AWSが管理している各種Agentやユーザーが独自作成したパッケージを配布できます。
<img width="486" alt="2018-12-02_11h09_23.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/6af91253-3fa7-7f8c-209c-13c073f951fa.png">

#Systems Manager Distributorによるバージョン管理
公式リポジトリを利用したインストールでAgentのインストールを感嘆に行う事ができます。
ですが、大きな運用現場では、常に最新版のAgentではなく、検証済みのAgentでバージョン固定を行う場合があります。

Systems Manager Distributorでは、インストールパッケージの中にソフトウェアパッケージを含める事ができるため、簡単にバージョン固定を行う事ができます。

#Systems Manager Distributorのパッケージ作成
[公式手順](https://docs.aws.amazon.com/systems-manager/latest/userguide/distributor-working-with-packages-create.html)を参考に作成をおこないます。

[サンプルパッケージ](https://docs.aws.amazon.com/systems-manager/latest/userguide/samples/ExamplePackage.zip)を参考にすれば作りやすいでしょう。

#ZabbixAgentパッケージの作成
それでは実際にパッケージを作成します。
まずは、各OS向けのinstall/uninstall スクリプトを作成します。

## Linuxの場合

```bash:install.sh
#!/bin/bash
cd `dirname $0`
echo 'Installing ExamplePackage on Amazon Linux...'

# Add command to call installer.  For example "yum install .\ExamplePackage.rpm"
sudo yum install zabbix-agent-3.0.23-1.amzn1.x86_64.rpm
```

```bash:uninstall.sh
#!/bin/bash
cd `dirname $0`
echo 'Uninstalling ExamplePackage on Amazon Linux...'

# Add command to call uninstaller.  For example "yum remove .\ExamplePackage.rpm"
sudo yum remove zabbix-agent-3.0.23-1.amzn1.x86_64.rpm
```
スクリプトとパッケージを配置し、ZIPでまとめます。
<img width="383" alt="2018-12-02_13h04_15.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/aa6e5d03-8192-709f-cc80-57fc36f496e6.png">

##Windowsの場合

```powershell:install.ps1
Write-Output 'Installing ExamplePackage on Windows...'
mkdir C:\Program Files\Zabbix
mkdir C:\Program Files\Zabbix\bin
mkdir C:\Program Files\Zabbix\conf
Copy-Item -Path ./*.exe -Destination C:\Program Files\Zabbix\bin
Copy-Item -Path ./*.conf -Destination C:\Program Files\Zabbix\conf
# Add command to call installer.  For example "msiexec /i .\ExamplePackage.deb /quiet"
Start-Process -FilePath C:\Program Files\Zabbix\bin\zabbix_agentd.exe -ArgumentList "-i","-c",.C:\Program Files\Zabbix\conf\zabbix_agentd.win.conf -Wait
```

```powershell:uninstall.ps1
Write-Output 'Uninstalling ExamplePackage on Windows...'

# Add command to call uninstaller.  For example "msiexec /x .\ExamplePackage.deb /quiet"
Start-Process -FilePath C:\Program Files\Zabbix\bin\win32\zabbix_agentd.exe  -ArgumentLis "-d"
```

<img width="340" alt="2018-12-02_14h42_27.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/c4927e6d-5a20-0b37-5c03-8a51581d9c49.png">


#JSONファイルの作成

作成したZIPファイルをリストして
チェックサムを記載します。
Windowsでは `Get-FileHash` コマンドでチェックサムの算出ができます。

```powershell
PS C:\Users\housi> Get-FileHash "C:\Users\housi\Desktop\Zabbix2.0.23\ZabbixAgent_win32.zip"

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          FDFC9C5A2EF0B15DB56C46B9D62BA5B1CA20A0210AEF459C42C6033A02D4B220       C:\Users\housi\Desktop\Zabbix...

```

```json:manifest.json
{
    "schemaVersion": "2.0",
    "version": "3.0.23",
    "publisher": "qryuu",
    "packages": {
        "windows": {
            "_any": {
                "x86_64": {
                    "file": "ZabbixAgent_win64.zip"
                },
                "386": {
                    "file": "ZabbixAgent_win32.zip"
                }
            }
        },
        "amazon": {
            "2": {
                "x86_64": {
                    "file": "ZabbixAgent_amzn2.zip"
                }
            },
            "_any":{
                "x86_64": {
                    "file": "ZabbixAgent_amzn1.zip"
                }
            }
        }
    },
    "files": {
        "ZabbixAgent_win64.zip": {
            "checksums": {
                "sha256": "0FBECEBC79B1C661937BF542CEA20556B302195DA60AC8E3AD983220E566ED57"
            }
        },
        "ZabbixAgent_win32.zip": {
            "checksums": {
                "sha256": "FDFC9C5A2EF0B15DB56C46B9D62BA5B1CA20A0210AEF459C42C6033A02D4B220"
            }
        },
        "ZabbixAgent_amzn2.zip": {
            "checksums": {
                "sha256": "79110173F8D50E7BBE5EA1B9AD47ECD317FB4FCBC6D46DA72E160406BA55BDAD"
            }
        },
        "ZabbixAgent_amzn1.zip": {
            "checksums":{
                "sha256":"0B66F27C731B8CAC8E2D841F8AF785BBFA6AA84DE97BA83DA7217E3680792A9B"
            }
        }
    }
}
```

対象OSおよび、x84_64,386,arm64の指定方法はドキュメントの[リスト](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-distributor.html#what-is-a-package-platforms)を参考にします。

OSのバージョンは

```bash:
cat /etc/os-release
```
で確認することができます。

Amazon Linux 2では "2"
Amazon Linux 無印ではリリース年月が出力されるため
Jsonでは

```json:
        "amazon": {
            "2": {
                "x86_64": {
                    "file": "ZabbixAgent_amzn2.zip"
                }
            },
            "_any":{
                "x86_64": {
                    "file": "ZabbixAgent_amzn1.zip"
                }
            }
```
としています。

###エラー
何故かinstall.ps1/uninstall.ps1を検出してくれないため、現在はWindowsを外して
JSONを作成してます。

```json:manifest.json
{
    "schemaVersion": "2.0",
    "version": "3.0.23-1",
    "publisher": "qryuu",
    "packages": {
        "amazon": {
            "2": {
                "x86_64": {
                    "file": "ZabbixAgent_amzn2.zip"
                }
            },
            "_any":{
                "x86_64": {
                    "file": "ZabbixAgent_amzn1.zip"
                }
            }
        }
    },
    "files": {
        "ZabbixAgent_amzn2.zip": {
            "checksums": {
                "sha256": "79110173F8D50E7BBE5EA1B9AD47ECD317FB4FCBC6D46DA72E160406BA55BDAD"
            }
        },
        "ZabbixAgent_amzn1.zip": {
            "checksums":{
                "sha256":"0B66F27C731B8CAC8E2D841F8AF785BBFA6AA84DE97BA83DA7217E3680792A9B"
            }
        }
    }
}
```

#ZIPファイルのアップロード
マニュフェストJsonの作成が終わったら、S3にバケットを作成しアップロードします。
<img width="353" alt="2018-12-02_13h26_50.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/0f02518d-0ad8-47d4-bddc-47f58d8bb14e.png">

バージョン毎にフォルダを作成します。
<img width="866" alt="2018-12-02_13h43_08.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/dcc6699f-9888-6038-d938-5b20fa2e3bec.png">

#Systems Manager Distributorパッケージの作成
Systems Manager Distributorを開き[パッケージの作成]をクリックします。
<img width="222" alt="2018-12-02_13h44_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/3263e540-aa46-a4f7-721a-9509f448cc6f.png">
<img width="509" alt="2018-12-02_13h44_45.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/04c947fd-2da2-9951-3cef-1bdc74817af9.png">
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102020/dddc555b-2ba1-8518-2cd9-23033eb4d52a.png)

バージョン名の部分はJSONファイルに記載した `"version": "3.0.23-1",` と完全一致している必要があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/102020/63305696-e258-b25f-e586-559b8e30c1d0.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102020/24a35133-b783-7cb0-92e2-38cd2f2c3c3d.png)

ステータスが Activeになれば作成完了です。

##Systems Manager Distributorによるインストール
出来上がったパッケージを選択し「インストールする」を選びます。
<img width="527" alt="2018-12-02_15h16_27.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/7b761476-737c-5caf-109d-dfd2aa755652.png">
<img width="477" alt="2018-12-02_15h16_32.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/64d5cba4-74a8-2cad-78b6-fd53026d2b8d.png">

Run Commandの画面に遷移するので、インストール対象のインスタンスを選択し、実行をクリックします。
<img width="686" alt="2018-12-02_15h18_10.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/d84b919d-8275-825a-f204-469dc027f66a.png">

###動かない。
現時点では、まだドキュメントが少なくエラーが発生してもトラブルシューティングを行う事ができません。

AWSドキュメントでより具体的なドキュメントが出てくることを待ちましょう。