2015年12月28日月曜日

Vagrantを使ってOpenStackを操作してみる

VagrantはVirtualBoxなどの仮想環境を外から制御するためのユーティリティです。
OpenStackのPluginもあるようなので試してみました。

クライアント環境をセットアップする


Ubuntu 14.04で試しました。

Vagrantをダウンロードする

こちらのURLからダウンロードできます。
https://www.vagrantup.com/downloads.html




UbuntuはDEBIAN系なのでDEBIANの64-bitを使用します。

ダウンロードURLをコピーして次のコマンドを実行します。

curl -L -O <URL>


Vagrantをインストールする

次のコマンドでインストールできます。

sudo dpkg -i <FILE>





(Opt1) OpenStack Providerをインストールする


"OpenStack Provider"をGoogleで検索すると次の2つがヒットします。

https://github.com/ggiamarchi/vagrant-openstack-provider

https://github.com/cloudbau/vagrant-openstack-plugin


まずは、OpenStack Providerの方を試してみようと思います。

READMEを見ると、次のコマンドでインストールできると記載されていたので実行します。
vagrant plugin install vagrant-openstack-provider



makeコマンドが見つからないといわれました。
Ubuntuはデフォルトではmakeコマンドが導入されていないんですね。
Ubuntu日本語フォーラムを見ると導入方法がかかれていました。
https://forums.ubuntulinux.jp/viewtopic.php?pid=9343

Makeをインストールする

次の2つのコマンドで導入できるようです。
$ sudo apt-get update
$ sudo apt-get install build-essential


一つ目のコマンドは成功しました。



2つ目のコマンドも成功したようです。


(途中省略)




もう一度OpenStack Providerのインストールを試みます。
しかし、まだエラーが出ています。

gem install json -v '1.7.7'を試せとあります。



このコマンドは成功したようです。


でもまだエラーが出ました。

Googleで"openstack-provider rb_str_new(FBUFFER_PAIR(fb)"を検索してみると、以下の記事がヒットしました。

https://github.com/ggiamarchi/vagrant-openstack-provider/issues/233

これをたどっていくと、次の記事が見つかるのですが、

https://github.com/flori/json/issues/229

jsonとRubyのバージョン互換の問題のようです。

Vagrantのバージョンを少し下げてリトライしてみます。

2015/12/27現在の最新バージョンは1.8.1ですが、少し前の1.7.4を試してみようと思います。
古いバージョンのVagrantは以下のURLからダウンロードできます。

https://releases.hashicorp.com/vagrant/

同様の手順で、Curlコマンドでダウンロードして、dpkgでインストールしました。
そして、plugin installを行うと、、、



難なくインストールに成功しました。


導入したら、OpenStack互換のBOXを作成する必要があるとのこと。
以下のコマンドを入力するとあるのでその通り実行します(dummyは好きな名前で良いようです)。

$ vagrant box add dummy https://github.com/cloudbau/vagrant-openstack-plugin/raw/master/dummy.box
 
 

Vagrantfileを作成する


OpenStack ProviderのREADMEを見ながら作業を進めます。
READMEのサンプルは次のようになっています。

require 'vagrant-openstack-provider'

Vagrant.configure('2') do |config|

  config.vm.box       = 'openstack'
  config.ssh.username = 'stack'

  config.vm.provider :openstack do |os|
    os.openstack_auth_url = 'http://keystone-server.net/v2.0/tokens'
    os.username           = 'openstackUser'
    os.password           = 'openstackPassword'
    os.tenant_name        = 'myTenant'
    os.flavor             = 'm1.small'
    os.image              = 'ubuntu'
    os.floating_ip_pool   = 'publicNetwork'
  end
end

私の環境では次のように作成しました。


require 'vagrant-openstack-provider'

Vagrant.configure('2') do |config|

  config.vm.box       = 'openstack'
  config.ssh.username = 'stack'

  config.vm.provider :openstack do |os|
    os.openstack_auth_url = 'https://icos-sea.openstack.blueboxgrid.com:5001/v2.0'
    os.username           = 'matsuos'
    os.password           = '<PASSWORD>'
    os.tenant_name        = 'demo project'
    os.flavor             = 'm1.tiny'
    os.image              = 'ubuntu-14.04'
    os.networks           = [
      'internal'
    ]
    os.floating_ip_pool   = 'external'
  end
end

os.networksはネットワークが1つしかなければ指定しなくてもエラーにはならないようです。
フローティングIPが不要な場合はos.floating_ip_poolも指定しなくてよさそうです。

それでは、インスタンスを作成してみましょう。
Vagrantfileが置かれているディレクトリで以下のコマンドを実行します。

$ vagrant up --provider=openstack



エラーが出て失敗してしまいました。
デバッグモードにする環境変数を設定するようガイドがありましたので従います。

$ export VAGRANT_OPENSTACK_LOG=debug

もう一度コマンドを実行してみます。

$ vagrant up --provider=openstack



ネットワーク情報の取得に失敗しているようです。
エラーメッセージをGithubで検索してみると、次の記事が見つかりました。

https://github.com/ggiamarchi/vagrant-openstack-provider/issues/235

この記事によると、OpenStackのKeystone(認証モジュール)が返すNeutron(Networkモジュール)へのエンドポイント(APIコール用URL)が間違っている場合に発生するとあります。

同記事に解決策がありましたので見習ってみます。
os.openstack_network_urlに正しいAPI用URLを指定すればよさそうです。
Vagrantfileにこの記述を追加します。下図の赤色部分が新たに追加した設定です。


require 'vagrant-openstack-provider'

Vagrant.configure('2') do |config|

  config.vm.box       = 'openstack'
  config.ssh.username = 'stack'

  config.vm.provider :openstack do |os|
    os.openstack_auth_url = 'https://icos-sea.openstack.blueboxgrid.com:5001/v2.0'
    os.openstack_network_url = 'https://icos-sea.openstack.blueboxgrid.com:9797/v2.0'    os.username           = 'matsuos'
    os.password           = 'change7Me'
    os.tenant_name        = 'demo project'
    os.flavor             = 'm1.tiny'
    os.image              = 'ubuntu-14.04'
    os.networks           = [
      'internal'
    ]
    os.floating_ip_pool   = 'external'
  end
end


 


HorizonポータルからInstance一覧を確認すると確かに「default」という名前でインスタンスが作成されていました。





SSHでログインできるようにする

このままでは、OpenStackのセキュリティグループ(Port Filter)を何も定義していないので、外からアクセスできません。また、Ubuntuイメージはデフォルトではリモートからのログインを許していないので、それも設定してあげる必要があります。さらにSSHのキーペアも作成しておく必要があります。
これらを加味したVagrantfileは次のようになります。赤字の部分が前項との違いです。

require 'vagrant-openstack-provider'

Vagrant.configure('2') do |config|

  config.vm.box       = 'openstack'
  config.ssh.username = 'ubuntu'
  config.ssh.private_key_path = '~/.ssh/matsuos-vagrant-key.pem'


  config.vm.provider :openstack do |os|

    # OpenStack Authentication
    os.openstack_auth_url =
        'https://icos-sea.openstack.blueboxgrid.com:5001/v2.0'
    os.openstack_network_url =
        'https://icos-sea.openstack.blueboxgrid.com:9797/v2.0'
    os.username           = 'matsuos'
    os.password           = 'change7Me'
    os.tenant_name        = 'demo project'

    # Instance definition
    os.flavor             = 'm1.tiny'
    os.image              = 'ubuntu-14.04'
    os.networks           = ['internal']
    os.floating_ip_pool   = 'external'
    os.keypair_name       = 'matsuos-vagrant-key'
    os.security_groups    = ['matsuos-sg-ssh']

    os.user_data          = '
                            #cloud-config
                            password: zaq12wsx
                            chpasswd: { expire: False }
                            ssh_pwauth: True
                            '

  end
end


赤字部分をひとつづつ説明します。

config.ssh.username = 'ubuntu'
ログインIDです。

 
config.ssh.private_key_path = '~/.ssh/matsuos-vagrant-key.pem'
OpenStackで作成した秘密鍵をこのパスに保管します。

os.keypair_name       = 'matsuos-vagrant-key'
OpenStackで作成したキーペア名です。

 
os.security_groups    = ['matsuos-sg-ssh']
OpenStackで作成したセキュリティグループです。
最低限SSHで外からアクセスできるようなセキュリティグループを作っておく必要があります。
 
os.user_data          = '
                        #cloud-config
                        password: zaq12wsx
                        chpasswd: { expire: False }
                        ssh_pwauth: True
                        '

インスタンスをブートする際に指定するスクリプトです。
ubuntuアカウントのパスワードを設定し、期限を無期限にしています。またsshのパスワード認証を許可しています。

キーペアはOpenStackのダッシュボードから作成します。
キーペアの名前は os.keypair_name       = 'matsuos-vagrant-key' で指定したものと同じにします。

作成したら秘密鍵をダウンロードします。

ダウンロードしたら config.ssh.private_key_path = '~/.ssh/matsuos-vagrant-key.pem' で指定したパスに保存します。



先ほど作成した区画はvagrant destroyコマンドで削除し、再びvagrant upコマンドを実行します。
なお、--provider=openstack は指定しなくても動きます。



最後の方で5行くらいConnection refusedが表示されています。ここはSSHのキー認証によるログインを試みているフェーズです。インスタンスが起動し終わるとログインができてプロンプトが返ってきます。

SSHのキー認証の設定がうまくいっていないと、ずーっと試行ループに入ってしまいます。
停止したい場合はpsコマンドを実行し、rubyプロセスのIDを確認し、killコマンドで終了させます。


0 件のコメント:

コメントを投稿