とんちゃんといっしょ

Cloudに関する技術とか日常とかについて書いたり書かなかったり

VagrantでCloudn Compute VPC (OpenNW)を操作する

背景

VagrantでCloudn Compute Flatは操作できるけど、VPC(OpenNW)が操作できないと周りで聞いたので解決できるかやってみた。

環境

最初に使った環境は以下のとおり

% vagrant -v
Vagrant 1.7.0

手順

vagrant-cloudstack pluginの導入

まず何にも用意がないのでまずはvagrant-cloudstackのプラグインを入れる。

% vagrant plugin install vagrant-cloudstack

無事に入ったことを確認

% vagrant plugin list                                                                                                                        
vagrant-cloudstack (0.10.0)
vagrant-share (1.1.3, system)

Vagrant用のテンプレートの作成 ~ Vagrantfileの作成

CloudnとVagrantを組み合わせて使う方法 を参考にさせてもらう。

が、何故か手元だとCloudmonkeyが動いてくれないので頑張って動かす。

MacでCloudmonkeyが動かなかったのでなんとかしてみた

動いたと思ったら、Cloudmonkeyの設定ファイルが変わっていたので設定の変更。

[core]
profile = server
...
[server]
apikey = your_apikey
secretkey = your_secretkey
url = https://vpcopennw-api.jp-e1.cloudn-service.com/client/api
expires = 600
timeout = 3600
verifysslcert = true

VagrantからCloudStackの操作に必要な情報をCloudmonkeyで拾ってくる。

> list templates templatefilter=self
template:
id = xxxx
name = vagrant  

> list vpcs
vpc:
name = xxx
id = xxxx

> list zones
zone:
name = jp-e1a
id = 80827400-840e-4e14-a0f3-54a998abff82

> list securitygroups
securitygroup:
id = xxxx

> list serviceofferings
serviceoffering:
name = m1.small
id = c6b72b0d-8541-474f-b617-e0051a9b6325

Vagrantfileを作成

Vagrant.configure(2) do |config|
  config.vm.box = "dummy"
  config.ssh.private_key_path = "~/.vagrant.d/insecure_private_key"

  config.vm.provider :cloudstack do |cloudstack, override|
    cloudstack.host       = 'vpcopennw-api.jp-e1.cloudn-service.com'
    cloudstack.path       = '/client/api'
    cloudstack.port       = 443
    cloudstack.scheme     = 'https'
    cloudstack.api_key    = 'xxxxx'
    cloudstack.secret_key = 'xxxxx'

    cloudstack.template_id         = 'xxxx'
    cloudstack.service_offering_id = 'c6b72b0d-8541-474f-b617-e0051a9b6325'
    cloudstack.zone_id             = '80827400-840e-4e14-a0f3-54a998abff82'
    cloudstack.security_group_ids  = ['xxxx']

    cloudstack.name = 'cloudn-openNW-instance'

    # ネットワークの種類と名前を指定
    cloudstack.network_type = 'Advanced'
    cloudstack.network_id   = 'xxxx'

    cloudstack.instance_ready_timeout = 300
  end
end

Vagrantの実行

準備はできたのでいざゆかん!

% vagrant up --provider=cloudstack
...
==> default: Waiting for instance to become "ready"...
==> default: Waiting for SSH to become available...

SSHがつながらなくてここから進まない・・・。 しかしながらWebコンソール上では元気に動いているように見えるので原因を考える。

・・・そうかVPCだから踏み台経由しないとインターネット越しだとつながらないのか。

というわけで、さっき起動したVMVPCの静的NATをかましてそこを踏み台に。

踏み台サーバにVagrantを導入

まずsshでアクセス

% -i ~/.vagrant.d/insecure_private_key vagrant@xxx.xxx.xxx.xx

めんどくさいのでrootに上がっておく。

% sudo su -

Vagrantを落としてくるためにwgetを導入してからVagrantを入手してインストール。 もちろんvagrant-cloudstackもインストールするのだがgccがないとvagrant-cloudstackがインストールできなくて困るのでgccも入れておく。

# yum install -y wget gcc
# wget https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.1_x86_64.rpm
# rpm -ihv vagrant_1.7.1_x86_64.rpm
# vagrant plugin install vagrant-cloudstack

これでVagrantが動く環境ができたので、あとはVagrantfileの用意をしなおす。

# mkdir cloudn-opennw
# cd cloudn-opennw
# vagrant init
# vi Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "dummy"
  config.ssh.private_key_path = "~/.vagrant.d/insecure_private_key"

  config.vm.provider :cloudstack do |cloudstack, override|
    cloudstack.host       = 'vpcopennw-api.jp-e1.cloudn-service.com'
    cloudstack.path       = '/client/api'
    cloudstack.port       = 443
    cloudstack.scheme     = 'https'
    cloudstack.api_key    = 'xxxxx'
    cloudstack.secret_key = 'xxxxx'

    cloudstack.template_id         = 'xxxx'
    cloudstack.service_offering_id = 'c6b72b0d-8541-474f-b617-e0051a9b6325'
    cloudstack.zone_id             = '80827400-840e-4e14-a0f3-54a998abff82'
    cloudstack.security_group_ids  = ['xxxx']

    cloudstack.name = 'cloudn-openNW-instance01' # 名前は上記のものと違うのを指定すること

    # ネットワークの種類と名前を指定
    cloudstack.network_type = 'Advanced'
    cloudstack.network_id   = 'xxxx'

    cloudstack.instance_ready_timeout = 300
  end
end

再挑戦

# vagrant up --provider=cloudstack
...
==> default: Waiting for instance to become "ready"...
==> default: Waiting for SSH to become available...
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if its present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine is booted and ready for use!
==> default: Rsyncing folder: /root/ => /vagrant

無事に起動できたので接続確認

# vagrant ssh
Thanks for using Official Template (CentOS).

====================================================
* Time Zone *
    Default TimeZone is UTC.
    You can change this with
      #sh /root/tzconfigurator.sh

* Stack (Application Set) *
    Default install apps is following.
      - ntp
      - acpiphp
      - password-agent
      - openssh-clients
      - wget
      - telnet
      - rsync

    You can update those apps to latest version with
      #yum update

    If you want to install some stack,
    you can install that with
      #sh /root/package_installer.sh

* To Change this message *
    please edit “/etc/motd”.
====================================================
[vagrant@cloudn-openNW-instance01 ~]$

無事にCloudnのOpenNW上に接続できるインスタンスVagrantから建てられた。

結論

  • VagrantからCloudnのOpenNWにインスタンスを建てることはできる。
  • インターネット越しだと起動までしかできない。
  • VPC内からであれば起動からアクセスまで可能
  • FlatタイプとOpenNWで多少のVagrantfileの変更が必要
  • OpenNWはNWタイプをAdvancedにしてNWのIDが必要
  • アクセス先のURLの変更が必要

おまけ

vagrant-cloudstackソースコードを眺めたけど、VPCを作る機能はなさそうだった。 というわけで、Vagrantを使う際は予めVPCとサブネットを作り、静的NATをしたインスタンスを用意した上でそのインスタンスからやってください。

参考