PowerShellで潜るOpenStack APIの海 - 素潜り編

PowerShell Advent Calendar 201415日目! 

OpenStackとは


皆さんはOpenStackというクラウド管理ツールをご存知でしょうか。OpenStackはプライベートクラウドを構築するためのオープンソースソフトウェアです。OpenStackを利用することで、大規模なクラウドを構築することができます。OpenStackRESTfull API経由で操作することができます。つまりパブリッククラウドで言うところのMicrosoft AzureAmazon Web Servicesと同様に、インフラの自動化をプライベートクラウドでも実現できます。

今回の手順は手元にOpenStackがある前提の内容になっていますが、対話的にPowerShellを利用しているので雰囲気だけでも感じて頂ければ幸いです。残念ながらOpenStackがない場合にはこの機会に是非、検証環境を準備してみてください。今回の内容ではOpenStackのインストールや構成までカバーすることはできませんが、日本語の技術資料も多く、日本OpenStackユーザー会(http://openstack.jp/)を初めとしたコミュニティ主催の勉強会も活発に行われています。

OpenStackDevStack(http://devstack.org/)などの展開ツールを利用してインストールすることができます。VMware vSphereの環境をすでにお持ちであれば、VMware社が提供するVOVA(VMware OpenStack Virtual Appliance)を利用することで手軽に評価用の環境を準備することができます。

PowerShellでやってみる

PowerShellは強力なスクリプト言語です。今さら説明は要りませんね。今日はOpenStackAPIの操作を通して、シェルの力を感じましょう。 
OpenStackAPIを利用するに際して、まず初めに行うのが認証です。資格情報(ユーザー名やパスワード)を渡してトークンを取得します。トークンはなぜ必要なのでしょうか。
OpenStackは大規模なクラウドを構築するためのソフトウェアであるため、多くのコンポーネントが存在します。サーバーを管理するためのNova・ネットワークを管理するためのNeutronなど他も合わせてすでに11種類のコンポーネントが存在し、さらに実験的に5種類あります。(201412月最新版Juno時点)(http://www.openstack.org/software/roadmap/)
これら複数のコンポーネントを縦断して利用するためのカギとしてトークンが利用されます。

ご参考:OpenStack API クイックスタート (http://docs.openstack.org/ja/api/quick-start/content/)
エンドポイント(APIを利用するためのURL)や各種資格情報はご自身の環境に読み替えてください。
ここからPowerShellを使って認証や各種リソースの取得・作成を通して仮想マシンを起動するところまで実施します。PowerShell ISEを利用してコードを張り付けて実行するのがオススメです。
 

認証トークンの取得

 
まずは認証から始めます。Invoke-RestMethodを利用してエンドポイントよりトークンを取得します。
PS C:\Windows\system32> $auth = @{
    "auth"= @{
        "tenantName" = "demo"
        "passwordCredentials" = @{
            "username" = "<username>"
            "password" = "<password>"
        }
    }
}
PS C:\Windows\system32> $auth_endpoint = "http://OpenStack:5000/v2.0/tokens"
PS C:\Windows\system32> $auth_request_body = ConvertTo-Json $auth
PS C:\Windows\system32> $auth_response = Invoke-RestMethod $auth_endpoint -Method Post -Body $auth_request_body -ContentType "application/json"

上記を実行して認証が成功すれば$auth_responseに結果が入ります。
PS C:\Windows\system32> $auth_response
access                                                                                                  
------                                                                                                  
@{token=; serviceCatalog=System.Object[]; user=; metadata=}  

HTTP応答の中身はJSONですが問題ありません、そうPowerShellならね。
ここで$auth_responseの後ろに続けて「.(ドット)」を入力して、Tabを押してみると補完されます。
PS C:\Windows\system32> $auth_response.access
 JSONで返却されている値が補完されるところが最高ですね。このままPowerShellでガンガン行けそうです。
PS C:\Windows\system32> $auth_response.access.token.id
上記を入力すると文字列がワァーっと表示されます。これがトークンです。
PS C:\Windows\system32> $auth_response.access.token.id.Length
5312
OpenStackのAPIを利用する際には、HTTP HeaderのX-Auth-Tokenに先ほど取得したトークンを入れてリクエストします。このトークンはOpenStackのどのサービスを利用する際にも使えるシングルサインオンを実現します。つまり、エンドポイントが変わってもトークンは変わりません。
 PS C:\Windows\system32> $auth_header = @{
    "X-Auth-Token" = $token
}

OSイメージの取得


サーバーを起動する前にOSイメージを取得します。今回はスペースがないため、すでに登録したイメージを取得する手順です。ご自身で登録されているOSイメージが異なる場合には「"cirros-0.3.1-x86_64-uec"」を読み替えてください。
PS C:\Windows\system32> $image_endpoint = "http://OpenStack:9292/"
PS C:\Windows\system32> $get_image_url = $image_endpoint + "/v2/images"
PS C:\Windows\system32> $image_response = Invoke-RestMethod $get_image_url -ContentType "application/json" -Headers $auth_header
PS C:\Windows\system32> $image = $image_response.images | where name -eq "cirros-0.3.1-x86_64-uec"
PS C:\Windows\system32> $image

status           : active
name             : cirros-0.3.1-x86_64-uec
tags             : {}
kernel_id        : 1d387488-83b9-42f1-8a1c-9c0a3f438770
container_format : ami
created_at       : 2014-12-14T09:34:58Z
ramdisk_id       : 864b47e3-9f10-473d-a048-d643551e3575
disk_format      : ami
updated_at       : 2014-12-14T09:35:00Z
visibility       : public
self             : /v2/images/ec856ac7-0983-4e62-b7e7-d145d5d02e3a
min_disk         : 0
protected        : False
id               : ec856ac7-0983-4e62-b7e7-d145d5d02e3a
file             : /v2/images/ec856ac7-0983-4e62-b7e7-d145d5d02e3a/file
checksum         : f8a2eeee2dc65b3d9b6e63678955bd83
owner            : d5e8617b3def492c95ef90c4225d5afc
size             : 25165824
min_ram          : 0
schema           : /v2/schemas/image
 これでOSのイメージが取得できました。CirrOSは機能が少なく、非常に小さなOSイメージであるためよく疎通試験におけるPingの打ち合いに利用されています。今回はこれを使います。

ネットワークの取得

この後サーバーを建てる際に必要となるネットワークを取得します。OSイメージ取得の手順と同様です。

ネットワーク取得の前に余談ですが、毎回「Invoke-RestMethod」と書くのは少し長いように感じますね。Aliasはないのでしょうか。
PS C:\Windows\system32> Get-Alias -Definition Invoke-RestMethod
CommandType     Name                                               ModuleName                           
-----------     ----                                               ----------                           
Alias           irm -> Invoke-RestMethod                                                                
ありましたね。それではさっそく「irm」を使っていきましょう。
PS C:\Windows\system32> $get_network_url = $networking_endpoint + "/v2.0/networks"
PS C:\Windows\system32> $network_response = irm $get_network_url -ContentType "application/json" -Headers $auth_header
PS C:\Windows\system32> $network = $network_response.networks | where name -eq "private"
PS C:\Windows\system32> $network

status                    : ACTIVE
subnets                   : {ae23f3da-4582-41b1-b990-147bb837c628}
name                      : private
provider:physical_network :
admin_state_up            : True
tenant_id                 : 7de99abb48104f418afbb96c5ad9baa1
provider:network_type     : local
router:external           : False
shared                    : False
id                        : 367614dc-76db-403d-b592-ef0f139502b2
provider:segmentation_id  :

 非常に簡単にネットワークが取得できました。 次に作成するサーバーはこのネットワークにせつぞくされます。

サーバーの作成と一覧

 サーバーをイメージとネットワークを指定して作成する

これまで取得したイメージの情報やネットワークの情報を利用して、サーバーを作成します。$server_specに作成したいサーバーの情報を入れます。今まで取得してきたイメージとネットワークのID(UUID: 128bit)を入れるだけで、簡単ですね。サーバーの情報をJSONに変換してPOSTします!少し$server_specの構造が深いのでConvertTo-JsonのDepthをお忘れなく。
PS C:\Windows\system32> $server_endpoint = "http://OpenStack:8774/v2/7de99abb48104f418afbb96c5ad9baa1"
PS C:\Windows\system32> $server_spec = @{
    "server" = @{
        "name" = "PowerShellLife"
        "imageRef" = $image.id
        "flavorRef" = 1
        "networks" = @(@{"uuid" = $network.id})
    }
}
PS C:\Windows\system32> $server_request_body = ConvertTo-Json $server_spec -Depth 3
PS C:\Windows\system32> $server_request_body 
{
    "server":  {
                   "networks":  [
                                    {
                                        "uuid":  "367614dc-76db-403d-b592-ef0f139502b2"
                                    }
                                ],
                   "name":  "PowerShellLife",
                   "imageRef":  "ec856ac7-0983-4e62-b7e7-d145d5d02e3a",
                   "flavorRef":  1
               }
PS C:\Windows\system32> $post_server_url = $server_endpoint + "/servers"
PS C:\Windows\system32> $create_server_response = irm $post_server_url -ContentType "application/json" -Method Post -Headers $auth_header -Body $server_request_body
PS C:\Windows\system32> $create_server_response 
server                                                                                                  
------                                                                                                  
@{security_groups=System.Object[]; OS-DCF:diskConfig=MANUAL; id=201641c4-5f41-41a0-9dc0-405bc3b91678; ...

サーバーの一覧を取得する

PS C:\Windows\system32> $get_server_url = $server_endpoint + "/servers/detail"
PS C:\Windows\system32> $server_response = irm $get_server_url -ContentType "application/json" -Headers $auth_header
PS C:\Windows\system32> $server_response status                               : ACTIVE
updated                              : 2014-12-15T13:48:02Z
hostId                               : 69951e3a31ee54eb5c75d81b8b8a80cb6e532b3d4ac4f99b0807d78e
OS-EXT-SRV-ATTR:host                 : OpenStack
addresses                            : @{private=System.Object[]}
links                                : {@{href=http://OpenStack:8774/v2/7de99abb48104f418afbb96c5ad9baa1/
                                       servers/72fa0f18-f317-4e71-bff3-e18316f94e26; rel=self}, @{href=ht
                                       tp://OpenStack:8774/7de99abb48104f418afbb96c5ad9baa1/servers/72fa0
                                       f18-f317-4e71-bff3-e18316f94e26; rel=bookmark}}
key_name                             :
image                                : @{id=ec856ac7-0983-4e62-b7e7-d145d5d02e3a; links=System.Object[]}
OS-EXT-STS:task_state                :
OS-EXT-STS:vm_state                  : active
OS-EXT-SRV-ATTR:instance_name        : instance-00000002
OS-SRV-USG:launched_at               : 2014-12-15T13:48:02.000000
OS-EXT-SRV-ATTR:hypervisor_hostname  : OpenStack
flavor                               : @{id=1; links=System.Object[]}
id                                   : 72fa0f18-f317-4e71-bff3-e18316f94e26
security_groups                      : {@{name=default}}
OS-SRV-USG:terminated_at             :
OS-EXT-AZ:availability_zone          : nova
user_id                              : 6b30b8701a7d45a69f6aea2106800f22
name                                 : PowerShellLife
created                              : 2014-12-15T13:47:46Z
tenant_id                            : 7de99abb48104f418afbb96c5ad9baa1
OS-DCF:diskConfig                    : MANUAL
os-extended-volumes:volumes_attached : {}
accessIPv4                           :
accessIPv6                           :
progress                             : 0
OS-EXT-STS:power_state               : 1
config_drive                         :
metadata                             :


 最後に

今回はOpenStack APIをPowerShellで触ってみるということで、OpenStack APIの浅いところを泳いでみました。PowerShellでOpenStackを触ることになった人が一人でも助かりますように。。。

コメント

このブログの人気の投稿

CoreOSとVMware vSphereでDocker環境を構築する

NVGRE ゲートウェイを直接ルーティングする場合の接続文字列