本日も乙

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

gcloud コマンドで GCE インスタンスを OS 別にフィルタする

今日も小ネタです。
GCE インスタンスを OS 別に集計する必要があるとします。無い人もいるかもしれないですが、あるとします*1
Amazon EC2であれば aws ec2 describe-instances コマンドの --filters オプションに platform があるので、Windowsホストの絞り込みが容易にできます。

describe-instances — AWS CLI Command Reference

GCE インスタンスの場合 gcloud compute list コマンドの --filter オプションにはそのような指定項目がありません。--filter オプションは出力結果を柔軟にフィルタできる便利なオプションなので、これを使いこなすことで自由な絞り込みができます。

gcloud compute instances list  |  Cloud SDK  |  Google Cloud

# Windows インスタンスのみを表示
$ gcloud compute instances list --filter="disks[0].guestOsFeatures[].type:WINDOWS"

# 起動中の Windows インスタンスに限定する場合
$ gcloud compute instances list --filter="STATUS:RUNNING AND disks[0].guestOsFeatures[].type:WINDOWS"

もしくは --format オプションで出力する項目を増やすことで、grep でフィルタできます。これだと Linux の場合のみも出力できます。
表示する項目は適宜変更してください。

# Windows インスタンスのみを表示
$ gcloud compute instances list --format="table(name,zone.basename(),machine_type.basename(),preemptible,internal_ip,external_ip,status,disks[0].guestOsFeatures[].type.list())" | grep 'WINDOWS'

# 起動中の Windows インスタンスに限定する場合
$ gcloud compute instances list --format="table(name,zone.basename(),machine_type.basename(),preemptible,internal_ip,external_ip,status,disks[0].guestOsFeatures[].type.list())" --filter="STATUS:RUNNING" | grep 'WINDOWS'

# Linux インスタンスのみを表示(grep -vにするだけ)
$ gcloud compute instances list --format="table(name,zone.basename(),machine_type.basename(),preemptible,internal_ip,external_ip,status,disks[0].guestOsFeatures[].type.list())" | grep -v 'WINDOWS'

# 起動中の Linux インスタンスに限定する場合(grep -vにするだけ)
$ gcloud compute instances list --format="table(name,zone.basename(),machine_type.basename(),preemptible,internal_ip,external_ip,status,disks[0].guestOsFeatures[].type.list())" --filter="STATUS:RUNNING" | grep -v 'WINDOWS'

参考文献

*1:なぜその必要があるかは聞かないでください・・・