fbpx

softlayer-api-ruby-client で Virtual Server を作成・閲覧・破棄する #softlayer

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

softlayer-api-ruby-client とは

softlayer-api-ruby-client とは、SoftLayer の API 呼び出しを支援する Ruby ライブラリです。ドキュメントは Ruby | SoftLayer Development Network にあります。

softlayer-api-ruby-client は RubyGems で提供されています。あらかじめ gem コマンドでインストールしておいてください。

softlayer-api-ruby-client で Virtual Server を作成する

それでは softlayer-api-ruby-client で Virtual Server を作成してみましょう。

プログラム


#!/usr/bin/ruby

require 'softlayer_api'
require 'pp'

#
# fill your SoftLayer API username and API key
#
api_username = ENV['SOFTLAYER_API_USERNAME'] || 'YOUR_SOFTLAYER_API_USERNAME'
api_key = ENV['SOFTLAYER_API_KEY'] || 'YOUR_SOFTLAYER_API_KEY'

#
# http://sldn.softlayer.com/reference/services/SoftLayer_Virtual_Guest
#
virtual_guest_service = SoftLayer::Service.new( 'SoftLayer_Virtual_Guest',
:username => api_username,
:api_key => api_key,
)

#
# http://sldn.softlayer.com/reference/services/SoftLayer_Virtual_Guest/createObject
#
template = {}

#
# Required
#
template['hostname'] = 'test-%s' % Time.now.strftime( '%F%T' ).gsub(/\D/, '' )
template['domain'] = 'example.jp'
template['startCpus'] = 1
template['maxMemory'] = 1024
template['hourlyBillingFlag'] = true
template['localDiskFlag'] = true

#
# Optional
#
# http://sldn.softlayer.com/reference/datatypes/SoftLayer_Virtual_Disk_Image/
template['blockDevices'] = [ { 'device' => 0,
'diskImage' => { 'capacity' => 25 } } ]
# http://sldn.softlayer.com/reference/datatypes/SoftLayer_Location/
template['datacenter'] = { 'name' => 'sjc01' }
template['operatingSystemReferenceCode'] = 'UBUNTU_12_64'
# http://sldn.softlayer.com/reference/datatypes/SoftLayer_Virtual_Guest_Network_Component/
template['networkComponents'] = [ { 'maxSpeed' => 10 } ]

#
# Optional (default)
#
# template['dedicatedAccountHostOnlyFlag']
# template['blockDeviceTemplateGroup'] globalIdentifier
# template['privateNetworkOnlyFlag']
# template['primaryNetworkComponent'] networkVlan.id
# template['primaryBackendNetworkComponent'] networkVlan.id
# template['userData'] value
# template['sshKeys']
# template['postInstallScriptUri']

response = virtual_guest_service.createObject( template )


#
# result
#
pp response

解説

APIサービスは SoftLayer::Service クラスを通して利用します。
仮想サーバインスタンスの作成は、SoftLayer_Virtual_Guest API サービスを用います。
まずこれに対して認証を行います。
返り値は SoftLayer_Virtual_Guest データタイプとなります。以降はこのオブジェクトを通して操作を行います。


virtual_guest_service = SoftLayer::Service.new( 'SoftLayer_Virtual_Guest',
:username => api_username,
:api_key => api_key,
)

作成する仮想サーバインスタンスの設定を決めます。
設定できる項目は SoftLayer_Virtual_Guest::createObject にある通りで、必須項目、条件つき必須項目、任意項目に分かれています。

まず必須項目です。

  • ホスト名: test-年月日時分秒
  • ドメイン名: example.jp
  • CPUコア数: 1
  • メモリ: 1024MB
  • 課金: 時
  • ディスク: ローカルディスク

この項目で設定します。
課金は時と月で選択でき、ディスクはローカルディスクとSANで選択できます。


template['hostname'] = 'test-%s' % Time.now.strftime( '%F%T' ).gsub(/\D/, '' )
template['domain'] = 'example.jp'
template['startCpus'] = 1
template['maxMemory'] = 1024
template['hourlyBillingFlag'] = true
template['localDiskFlag'] = true

次に任意項目です。

  • ブロックデバイス: 0番 25GB
  • データセンター: サンノゼ
  • OS: Ubuntu 12.04 (amd64)
  • ネットワーク: 10Mbps

この項目で設定します。
ブロックデバイスは SoftLayer_Virtual_Disk_Image データタイプに基いて設定します。配列で複数のデバイスを割り当てることもできます。なお、1番はスワップデバイスとして予約されています。


template['blockDevices'] = [ { 'device' => 0,
'diskImage' => { 'capacity' => 25 } } ]

データセンターは SoftLayer_Location データタイプに基いて設定します。


template['datacenter'] = { 'name' => 'sjc01' }

オペレーティングシステムは SoftLayer_Container_Virtual_Guest_Configuration データタイプに基いて設定します。


template['operatingSystemReferenceCode'] = 'UBUNTU_12_64'

ネットワーク速度は SoftLayer_Virtual_Guest_Network_Component データタイプに基いて設定します。


template['networkComponents'] = [ { 'maxSpeed' => 10 } ]

ここでは次の任意項目は指定せず、すべてデフォルト値を用いることとします。


# template['dedicatedAccountHostOnlyFlag']
# template['blockDeviceTemplateGroup'] globalIdentifier
# template['privateNetworkOnlyFlag']
# template['primaryNetworkComponent'] networkVlan.id
# template['primaryBackendNetworkComponent'] networkVlan.id
# template['userData'] value
# template['sshKeys']
# template['postInstallScriptUri']

設定値を template ハッシュにまとめて SoftLayer_Virtual_Guest::createObject に与えます。


response = virtual_guest_service.createObject( template )


pp response

次の SoftLayer_Virtual_Guest オブジェクトが得られます。


{"accountId"=>XXXX78,
"createDate"=>"2014-04-30T13:01:17+09:00",
"dedicatedAccountHostOnlyFlag"=>false,
"domain"=>"example.jp",
"fullyQualifiedDomainName"=>"test-20140430130115.example.jp",
"hostname"=>"test-20140430130115",
"id"=>XXXXX14,
"lastPowerStateId"=>nil,
"lastVerifiedDate"=>nil,
"maxCpu"=>1,
"maxCpuUnits"=>"CORE",
"maxMemory"=>1024,
"metricPollDate"=>nil,
"modifyDate"=>nil,
"startCpus"=>1,
"statusId"=>1001,
"globalIdentifier"=>"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"status"=>{"keyName"=>"ACTIVE", "name"=>"Active"}}

Web UI を確認してください。仮想サーバインスタンスが準備されているはずです。

softlayer-api-ruby-client で Virtual Server を閲覧する

次に作成した仮想サーバインスタンスを softlayer-api-ruby-client で閲覧してみましょう。

プログラム


#!/usr/bin/ruby

require 'softlayer_api'
require 'pp'

#
# fill your SoftLayer API username and API key
#
api_username = ENV['SOFTLAYER_API_USERNAME'] || 'YOUR_SOFTLAYER_API_USERNAME'
api_key = ENV['SOFTLAYER_API_KEY'] || 'YOUR_SOFTLAYER_API_KEY'

#
# Virtual Server id
#
id = ARGV.shift()

#
# http://sldn.softlayer.com/reference/services/SoftLayer_Virtual_Guest
#
virtual_guest_service = SoftLayer::Service.new( 'SoftLayer_Virtual_Guest',
:username => api_username,
:api_key => api_key,
)

#
# http://sldn.softlayer.com/reference/datatypes/SoftLayer_Virtual_Guest
#
# https://github.com/softlayer/softlayer-python/blob/v3.1.0/SoftLayer/managers/vs.py#L139
#
mask = [
'id',
'globalIdentifier',
'fullyQualifiedDomainName',
'hostname',
'domain',
'createDate',
'modifyDate',
'provisionDate',
'notes',
'dedicatedAccountHostOnlyFlag',
'privateNetworkOnlyFlag',
'primaryBackendIpAddress',
'primaryIpAddress',
'networkComponents[id, status, speed, maxSpeed, name,' +
'macAddress, primaryIpAddress, port, primarySubnet]',
'lastKnownPowerState.name',
'powerState',
'status',
'maxCpu',
'maxMemory',
'datacenter',
'activeTransaction[id, transactionStatus[friendlyName,name]]',
'lastOperatingSystemReload.id',
'blockDevices',
'blockDeviceTemplateGroup[id, name, globalIdentifier]',
'postInstallScriptUri',
'userData',
'operatingSystem.softwareLicense.' +
'softwareDescription[manufacturer,name,version,referenceCode]',
'operatingSystem.passwords[username,password]',
'hourlyBillingFlag',
'billingItem.recurringFee',
'tagReferences[id,tag[name,id]]',
'networkVlans[id,vlanNumber,networkSpace]',
]

#
# http://sldn.softlayer.com/reference/services/SoftLayer_Virtual_Guest/getObject
#
detail = virtual_guest_service.
object_with_id( id ).
object_mask( 'mask[' + mask.join( ',' ) + ']' ).
getObject


#
# result
#
pp detail

解説

仮想サーバインスタンスの閲覧は作成同様 SoftLayer_Virtual_Guest API サービスを用いるので、冒頭部分は省略します。

取得するデータは Object Masks を用いて決定します。対象は SoftLayer_Virtual_Guest データタイプです。

次は /softlayer-python 3.1.0 SoftLayer/managers/vs.py を流用したものです。なお、流用元は Python なので、流用先の Ruby の構文に合わせるために分割文字列の連結に + を用いています。


mask = [
'id',
'globalIdentifier',
'fullyQualifiedDomainName',
'hostname',
'domain',
'createDate',
'modifyDate',
'provisionDate',
'notes',
'dedicatedAccountHostOnlyFlag',
'privateNetworkOnlyFlag',
'primaryBackendIpAddress',
'primaryIpAddress',
'networkComponents[id, status, speed, maxSpeed, name,' +
'macAddress, primaryIpAddress, port, primarySubnet]',
'lastKnownPowerState.name',
'powerState',
'status',
'maxCpu',
'maxMemory',
'datacenter',
'activeTransaction[id, transactionStatus[friendlyName,name]]',
'lastOperatingSystemReload.id',
'blockDevices',
'blockDeviceTemplateGroup[id, name, globalIdentifier]',
'postInstallScriptUri',
'userData',
'operatingSystem.softwareLicense.' +
'softwareDescription[manufacturer,name,version,referenceCode]',
'operatingSystem.passwords[username,password]',
'hourlyBillingFlag',
'billingItem.recurringFee',
'tagReferences[id,tag[name,id]]',
'networkVlans[id,vlanNumber,networkSpace]',
]

SoftLayer_Virtual_Guest::getObject で特定のオブジェクトを取得するには object_with_id を用います。


detail = virtual_guest_service.
object_with_id( id ).
object_mask( 'mask[' + mask.join( ',' ) + ']' ).
getObject


pp detail

次の SoftLayer_Virtual_Guest オブジェクトが得られます。


{"createDate"=>"2014-04-30T13:01:17+09:00",
"dedicatedAccountHostOnlyFlag"=>false,
"domain"=>"example.jp",
"fullyQualifiedDomainName"=>"test-20140430130115.example.jp",
"hostname"=>"test-20140430130115",
"id"=>XXXXX14,
"maxCpu"=>1,
"maxMemory"=>1024,
"modifyDate"=>"2014-04-30T13:03:20+09:00",
"billingItem"=>{"recurringFee"=>".022"},
"blockDevices"=>
[{"bootableFlag"=>1,
"createDate"=>"2014-04-30T13:02:54+09:00",
"device"=>"0",
"diskImageId"=>XXXXX08,
"guestId"=>XXXXX14,
"hotPlugFlag"=>0,
"id"=>XXXXX00,
"modifyDate"=>nil,
"mountMode"=>"RW",
"mountType"=>"Disk",
"statusId"=>1,
"uuid"=>"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"},
{"bootableFlag"=>0,
"createDate"=>"2014-04-30T13:02:08+09:00",
"device"=>"1",
"diskImageId"=>XXXXX12,
"guestId"=>XXXXX14,
"hotPlugFlag"=>0,
"id"=>XXXXX88,
"modifyDate"=>nil,
"mountMode"=>"RW",
"mountType"=>"Disk",
"statusId"=>1,
"uuid"=>"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"}],
"datacenter"=>{"id"=>168642, "longName"=>"San Jose 1", "name"=>"sjc01"},
"globalIdentifier"=>"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"hourlyBillingFlag"=>true,
"networkComponents"=>
[{"id"=>XXXXX28,
"macAddress"=>"XX:XX:XX:XX:XX:f5",
"maxSpeed"=>10,
"name"=>"eth",
"port"=>0,
"speed"=>10,
"status"=>"ACTIVE",
"primaryIpAddress"=>"10.XX.XX.2",
"primarySubnet"=>
{"broadcastAddress"=>"10.XX.XX.63",
"cidr"=>26,
"gateway"=>"10.XX.XX.1",
"id"=>XXXX06,
"isCustomerOwned"=>false,
"isCustomerRoutable"=>false,
"modifyDate"=>"2014-04-30T13:01:41+09:00",
"netmask"=>"255.255.255.192",
"networkIdentifier"=>"10.XX.XX.0",
"networkVlanId"=>XXXX52,
"sortOrder"=>"4",
"subnetType"=>"PRIMARY",
"totalIpAddresses"=>64,
"usableIpAddressCount"=>61,
"version"=>4}},
{"id"=>XXXXX26,
"macAddress"=>"XX:XX:XX:XX:XX:f2",
"maxSpeed"=>10,
"name"=>"eth",
"port"=>1,
"speed"=>10,
"status"=>"ACTIVE",
"primaryIpAddress"=>"50.XX.XX.194",
"primarySubnet"=>
{"broadcastAddress"=>"50.XX.XX.199",
"cidr"=>29,
"gateway"=>"50.XX.XX.193",
"id"=>XXXX06,
"isCustomerOwned"=>false,
"isCustomerRoutable"=>false,
"modifyDate"=>"2014-04-30T13:01:40+09:00",
"netmask"=>"255.255.255.248",
"networkIdentifier"=>"50.XX.XX.192",
"networkVlanId"=>XXXX50,
"sortOrder"=>"4",
"subnetType"=>"PRIMARY",
"totalIpAddresses"=>8,
"usableIpAddressCount"=>5,
"version"=>4}}],
"networkVlans"=>
[{"id"=>XXXX50, "vlanNumber"=>XX33, "networkSpace"=>"PUBLIC"},
{"id"=>XXXX52, "vlanNumber"=>XX40, "networkSpace"=>"PRIVATE"}],
"operatingSystem"=>
{"hardwareId"=>nil,
"id"=>XXXXX16,
"manufacturerLicenseInstance"=>"",
"passwords"=>[{"password"=>"XXXXXXXX", "username"=>"root"}],
"softwareLicense"=>
{"id"=>1104,
"softwareDescriptionId"=>1025,
"softwareDescription"=>
{"manufacturer"=>"Ubuntu",
"name"=>"Ubuntu",
"referenceCode"=>"UBUNTU_12_64",
"version"=>"12.04-64 Minimal for CCI"}}},
"powerState"=>{"keyName"=>"RUNNING", "name"=>"Running"},
"primaryBackendIpAddress"=>"10.XX.XX.2",
"primaryIpAddress"=>"50.XX.XX.194",
"privateNetworkOnlyFlag"=>false,
"provisionDate"=>"2014-04-30T13:04:07+09:00",
"status"=>{"keyName"=>"ACTIVE", "name"=>"Active"},
"tagReferences"=>[],
"userData"=>[]}

softlayer-api-ruby-client で Virtual Server を破棄する

最後に作成した仮想サーバインスタンスを softlayer-api-ruby-client で破棄してみましょう。

プログラム


#!/usr/bin/ruby

require 'softlayer_api'
require 'pp'

#
# fill your SoftLayer API username and API key
#
api_username = ENV['SOFTLAYER_API_USERNAME'] || 'YOUR_SOFTLAYER_API_USERNAME'
api_key = ENV['SOFTLAYER_API_KEY'] || 'YOUR_SOFTLAYER_API_KEY'

#
# Virtual Server id
#
id = ARGV.shift()

#
# http://sldn.softlayer.com/reference/services/SoftLayer_Virtual_Guest
#
virtual_guest_service = SoftLayer::Service.new( 'SoftLayer_Virtual_Guest',
:username => api_username,
:api_key => api_key,
)

#
# http://sldn.softlayer.com/reference/services/SoftLayer_Virtual_Guest/deleteObject
#
result = virtual_guest_service.
object_with_id( id ).
deleteObject


#
# result
#
pp result

解説

仮想サーバインスタンスの破棄は作成と閲覧同様 SoftLayer_Virtual_Guest API サービスを用いるので、冒頭部分は省略します。

SoftLayer_Virtual_Guest::deleteObject で特定の仮想サーバインスタンスを削除するには object_with_id を用います。


result = virtual_guest_service.
object_with_id( id ).
deleteObject


pp result

次の結果が得られます。


true

Web UI を確認してください。仮想サーバインスタンスが破棄されているはずです。

まとめ

公式ドキュメントのある SoftLayer Development Network は大変充実していますが、それゆえに目的のものを探しづらいという点があると思います。本記事では仮想サーバインスタンスの作成・閲覧・破棄に絞って一例を紹介しました。参考になれば幸いです。

Author

Chef・Docker・Mirantis製品などの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

新規CTA