PowerShellで潜るOpenStack APIの海 - 素潜り編
PowerShell Advent Calendar 2014の15日目!
エンドポイント(APIを利用するためのURL)や各種資格情報はご自身の環境に読み替えてください。
HTTP応答の中身はJSONですが問題ありません、そうPowerShellならね。
ここで$auth_responseの後ろに続けて「.(ドット)」を入力して、Tabを押してみると補完されます。
サーバーを起動する前にOSイメージを取得します。今回はスペースがないため、すでに登録したイメージを取得する手順です。ご自身で登録されているOSイメージが異なる場合には「"cirros-0.3.1-x86_64-uec"」を読み替えてください。
ネットワーク取得の前に余談ですが、毎回「Invoke-RestMethod」と書くのは少し長いように感じますね。Aliasはないのでしょうか。
OpenStackとは
皆さんはOpenStackというクラウド管理ツールをご存知でしょうか。OpenStackはプライベートクラウドを構築するためのオープンソースソフトウェアです。OpenStackを利用することで、大規模なクラウドを構築することができます。OpenStackはRESTfull API経由で操作することができます。つまりパブリッククラウドで言うところのMicrosoft AzureやAmazon Web Servicesと同様に、インフラの自動化をプライベートクラウドでも実現できます。
今回の手順は手元にOpenStackがある前提の内容になっていますが、対話的にPowerShellを利用しているので雰囲気だけでも感じて頂ければ幸いです。残念ながらOpenStackがない場合にはこの機会に是非、検証環境を準備してみてください。今回の内容ではOpenStackのインストールや構成までカバーすることはできませんが、日本語の技術資料も多く、日本OpenStackユーザー会(http://openstack.jp/)を初めとしたコミュニティ主催の勉強会も活発に行われています。
OpenStackはDevStack(http://devstack.org/)などの展開ツールを利用してインストールすることができます。VMware vSphereの環境をすでにお持ちであれば、VMware社が提供するVOVA(VMware OpenStack Virtual Appliance)を利用することで手軽に評価用の環境を準備することができます。
PowerShellでやってみる
PowerShellは強力なスクリプト言語です。今さら説明は要りませんね。今日はOpenStackAPIの操作を通して、シェルの力を感じましょう。
OpenStackのAPIを利用するに際して、まず初めに行うのが認証です。資格情報(ユーザー名やパスワード)を渡してトークンを取得します。トークンはなぜ必要なのでしょうか。
OpenStackは大規模なクラウドを構築するためのソフトウェアであるため、多くのコンポーネントが存在します。サーバーを管理するためのNova・ネットワークを管理するためのNeutronなど他も合わせてすでに11種類のコンポーネントが存在し、さらに実験的に5種類あります。(2014年12月最新版Juno時点)(http://www.openstack.org/software/roadmap/)
これら複数のコンポーネントを縦断して利用するためのカギとしてトークンが利用されます。
エンドポイント(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_responseaccess
------
@{token=; serviceCatalog=System.Object[]; user=; metadata=}
HTTP応答の中身はJSONですが問題ありません、そうPowerShellならね。
ここで$auth_responseの後ろに続けて「.(ドット)」を入力して、Tabを押してみると補完されます。
PS C:\Windows\system32> $auth_response.accessJSONで返却されている値が補完されるところが最高ですね。このままPowerShellでガンガン行けそうです。
PS C:\Windows\system32> $auth_response.access.token.id上記を入力すると文字列がワァーっと表示されます。これがトークンです。
PS C:\Windows\system32> $auth_response.access.token.id.LengthOpenStackのAPIを利用する際には、HTTP HeaderのX-Auth-Tokenに先ほど取得したトークンを入れてリクエストします。このトークンはOpenStackのどのサービスを利用する際にも使えるシングルサインオンを実現します。つまり、エンドポイントが変わってもトークンは変わりません。
5312
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
これでOSのイメージが取得できました。CirrOSは機能が少なく、非常に小さなOSイメージであるためよく疎通試験におけるPingの打ち合いに利用されています。今回はこれを使います。
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イメージ取得の手順と同様です。ネットワーク取得の前に余談ですが、毎回「Invoke-RestMethod」と書くのは少し長いように感じますね。Aliasはないのでしょうか。
PS C:\Windows\system32> Get-Alias -Definition Invoke-RestMethodありましたね。それではさっそく「irm」を使っていきましょう。
CommandType Name ModuleName
----------- ---- ----------
Alias irm -> Invoke-RestMethod
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を触ることになった人が一人でも助かりますように。。。最後に
コメント
コメントを投稿