本日も乙

ただの自己満足な備忘録。

【GCP】OS Inventory Management でパッケージ一覧を取得する

本稿は Sansan Advent Calendar 2019 の20日目の記事です。
今年は GCP に触れることが多い一年でした。GCP に触れてきた中で気になるアップデートがあったので紹介をします。

OS Inventory Management とは

OS Inventory Management は GCE インスタンスに関する OS やパッケージ情報を収集し、取得することができるサービスです。2019年7月8日にBetaがリリースされ、2019年10月2日に GA になりました
AWS だと AWS System Manager インベントリ という機能がありますがそれと同じようなものですが、マネジメントコンソールはなく、操作はコマンドラインのみとなります。

OS Inventory Management によって収集された情報は GCE メタデータのゲスト属性に保存され、以下の用途によって利用されることを想定されています。

  • 特定のバージョンのオペレーティングシステムを実行している仮想マシンを識別する
  • VMインスタンスにインストールされているパッケージを表示する
  • 各VMインスタンスで利用可能なパッケージ更新のリストを取得する
  • VMインスタンスの不足しているパッケージ、更新、またはパッチ情報を取得する

OS Inventory Management の有効化

実際に試してみましょう。OS Inventory Management を使用するには、メタデータで有効化する必要があります。
GCE インスタンスかプロジェクトのメタデータに以下の値を設定します。

  • enable-guest-attributes : TRUE
  • enable-os-inventory : TRUE

GCE インスタンスのメタデータに設定するとその GCE インスタンスのみ有効化され、プロジェクト全体のメタデータに設定するとプロジェクト内すべての GCE インスタンスで有効になります。
今回はプロジェクト全体のメタデータで設定します。

os-inventory-metadata

GCE インスタンスの作成、OS 構成エージェントのインストール

イベントリを取得するための GCE インスタンスを作成します。今回は Linux(Ubuntu 18)と Windows Server 2019 の2つを作ります。
Cloud Shell を立ち上げ、以下のようなコマンドを実行してインスタンスを作ります。また、起動時に OS 構成エージェントをインストールするように起動スクリプトを仕込みます。

$ gcloud config set project [PROJECT]

# デフォルトのサービスアカウントを取得
$ SA_EMAIL=$(gcloud iam service-accounts list \
  --filter="displayName:Compute Engine default service account" \
  --format='value(email)')

# Linux インスタンス

## 起動スクリプト
$ cat << EOF > startup_linux.sh
#! /bin/bash
sudo su -c "echo 'deb http://packages.cloud.google.com/apt google-osconfig-agent-stretch-stable main' > \
/etc/apt/sources.list.d/google-osconfig-agent.list"
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install -y google-osconfig-agent
EOF

$ gcloud beta compute instances create linux-test \
  --zone=us-central1-a \
  --machine-type=n1-standard-1 \
  --subnet=default \
  --network-tier=PREMIUM \
  --maintenance-policy=MIGRATE \
  --service-account=$SA_EMAIL \
  --scopes=https://www.googleapis.com/auth/cloud-platform \
  --image=ubuntu-1804-bionic-v20191211 \
  --image-project=ubuntu-os-cloud \
  --boot-disk-size=10GB \
  --boot-disk-type=pd-standard \
  --boot-disk-device-name=linux-test \
  --metadata-from-file=startup-script=startup_linux.sh

# Windows インスタンス
$ gcloud beta compute instances create windows-test \
  --zone=us-central1-a \
  --machine-type=n1-standard-1 \
  --subnet=default \
  --network-tier=PREMIUM \
  --maintenance-policy=MIGRATE \
  --service-account=$SA_EMAIL \
  --scopes=https://www.googleapis.com/auth/cloud-platform \
  --image=windows-server-2019-dc-core-v20191210 \
  --image-project=windows-cloud \
  --boot-disk-size=32GB \
  --boot-disk-type=pd-standard \
  --boot-disk-device-name=windows-test \
  --metadata windows-startup-script-ps1="googet -noconfirm install google-osconfig-agent"

OS 構成エージェントが正常にインストールされていると、次のコマンドでインスタンス一覧に表示されます。

$ gcloud compute instances os-inventory list-instances
NAME          ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
linux-test    us-central1-a  n1-standard-1               10.128.0.4   34.68.43.177  RUNNING
windows-test  us-central1-a  n1-standard-1               10.128.0.5   34.67.54.215  RUNNING

イベントリデータを表示してみる

次のコマンドを実行すると、OS情報とインストールされているパッケージ情報などが出力されます。
取得できる情報はドキュメントを参照してください。

$ gcloud compute instances os-inventory describe linux-test --zone us-central1-a

$ gcloud compute instances os-inventory describe windows-test --zone us-central1-a

このように表示されます。

Linux サーバ

os-inventory-linux

Windows サーバ

os-inventory-windows

このままでも良いのですが、加工しやすいようにアップデートできるパッケージ一覧を取得してみましょう。--format オプションを駆使することで任意の情報を取得できます。

$ gcloud compute instances os-inventory describe linux-test --zone us-central1-a \
  --format "json(PackageUpdates.apt[].Name,PackageUpdates.apt[].Version)"
{
  "PackageUpdates": {
    "apt": [
      {
        "Name": "libdevmapper1.02.1",
        "Version": "2:1.02.145-4.1ubuntu3.18.04.2"
      },
      {
        "Name": "libdevmapper-event1.02.1",
        "Version": "2:1.02.145-4.1ubuntu3.18.04.2"
      },
...(省略)...
      {
        "Name": "open-vm-tools",
        "Version": "2:11.0.1-2ubuntu0.18.04.2"
      }
    ]
  }
}

$ gcloud compute instances os-inventory describe windows-test --zone us-central1-a \
  --format "json(PackageUpdates.googet[].Name,PackageUpdates.googet[].Version)"
{
  "PackageUpdates": {
    "googet": [
      {
        "Name": "google-compute-engine-diagnostics",
        "Version": "1.1.0@0"
      }
    ]
  }
}

まとめ

OSやパッケージ情報を収集する OS Inventory Management について紹介しました。API 経由でパッケージ一覧を取得できるため、外部システムとの連携ができます。例えば、脆弱性管理などに使えそうです。
まだ、コマンドラインでしか操作できないのでマネジメントコンソールでパッケージ一覧が表示されるようになるとさらに便利になりそうですね。

参考文献