awsに接続してssh_configを生成するec2sshというツールがあるのだけど、awsやazコマンドで得たjsonをjqで加工して似たようなことができそうだなと思ったのでやってみた。 awsの場合は、以下のようにaws-cliでec2の情報を取得してjqに渡してやればいい。ユーザ名は取得できないので、必要であればjqの処理のとこに(決め打ちになってしまうが)追記してやればいい。

aws ec2 describe-instances | jq -r '.Reservations[].Instances[]|(.Tags[]|select(.Key == "Name")|.Value) as $v|"Host "+$v+"\n   HostName "+.PublicIpAddress+"\n"'

Azureの場合、azコマンドを使って以下のようにする。こっちの方はAdminUsernameという項目をちゃんと持ってるので、そこからユーザ名を取得できる。 ただ、デフォルトだとIPアドレスが取得できないため、-dを付与する必要がある点に注意(で、付与するとクエリ結果返ってくるのが遅くなるという…)。

az vm list -d | jq -r '.[] | select(.osProfile.linuxConfiguration != null) | "Host "+.name +"\n    HostName " + .publicIps + "\n    User " + .osProfile.adminUsername + "\n"'

こんな感じで、AWSやAzure上で稼働しているインスタンスのssh_configが生成できる。