2done.org

Linuxメインなメモ書き。二度寝してから書く。(ご意見は Twitter あたりで。そのうちコメント欄つけます。)

Nova で躓いたこととか罠とか

(12/27) Ubuntu パッケージを利用

(2/10)疑問等追加

nova-manage db sync が失敗する

UTF8 なデータベースを作成していると、以下のエラーが出力されコマンドが失敗する。

2011-12-26 12:14:04,951 CRITICAL nova [-] (OperationalError) (1071, 'Specified key was too long; max key length is 1000 bytes') '\nCREATE TABLE user_project_association (\n\tcreated_at DATETIME, \n\tupdated_at DATETIME, \n\tdeleted_at DATETIME, \n\tdeleted BOOL, \n\tuser_id VARCHAR(255) NOT NULL, \n\tproject_id VARCHAR(255) NOT NULL, \n\tPRIMARY KEY (user_id, project_id), \n\tFOREIGN KEY(project_id) REFERENCES projects (id), \n\tFOREIGN KEY(user_id) REFERENCES users (id), \n\tCHECK (deleted IN (0, 1))\n)\n\n' ()

MySQL の仕様のようで主キーの合計が1000バイトを超えるとだめらしい。

今回は user_id(255) + project_id(255) = 510。

さらに UTF8 なので 3倍 して 510 * 3 = 1530バイトとなってしまうため、アウトとなる。

UTF8 を諦め、Latin-1 などで DB を作るとすんなりと行ける。

nova-manage project zipfile $PRJ $USER ZIP.zip が失敗する

(パッケージインストールの場合)実行の際には nova-api が必要だった。

nova-api をインストールすると、/var/lib/nova/CA にファイルがもりもりできる。

$ ls /var/lib/nova/CA
-rw-rw-r-- 1 nova nova 1029 2011-12-27 15:45 cacert.pem
drwxrwxr-x 2 nova nova 4096 2011-12-27 15:45 certs
drwxrwxr-x 2 nova nova 4096 2011-12-27 15:45 crl
-rw-rw-r-- 1 nova nova  426 2011-12-27 15:45 crl.pem
-rw-r--r-- 1 root root  108 2011-12-27 15:45 index.txt
-rw-r--r-- 1 root root   20 2011-12-27 15:45 index.txt.attr
-rw-rw-r-- 1 nova nova    0 2011-12-27 15:45 index.txt.old
drwxr-xr-x 2 nova nova 4096 2011-12-09 23:22 INTER
drwxr-xr-x 2 nova nova 4096 2011-12-27 15:45 newcerts
-rw-r--r-- 1 nova nova 2895 2011-12-27 15:45 openssl.cnf
drwxr-xr-x 2 nova nova 4096 2011-12-27 15:45 private
drwxr-xr-x 2 nova nova 4096 2011-12-09 23:22 reqs
-rw-r--r-- 1 root root    3 2011-12-27 15:45 serial
-rw-rw-r-- 1 nova nova    3 2011-12-27 15:45 serial.old

nova-manage service list の State が XXX のまま

nova-manage service list でサービスを見ても State が XXX のままとなり :-) してくれない。

ローカルでサービスは正常に起動しているが、コマンドを実行すると以下のようになる。

bob-1$ sudo nova-manage service list
Binary           Host                 Zone             Status     State Updated_At
nova-scheduler   bob-1                nova             enabled    :-)   2012-02-10 04:09:52
nova-compute     bob-2                nova             enabled    XXX   2012-02-10 04:09:35
nova-compute     bob-3                nova             enabled    XXX   2012-02-10 04:09:34
nova-compute     bob-4                nova             enabled    XXX   2012-02-10 04:09:28
nova-network     bob-2                nova             enabled    XXX   2012-02-10 04:09:34
nova-network     bob-3                nova             enabled    XXX   2012-02-10 04:09:34
nova-network     bob-4                nova             enabled    XXX   2012-02-10 04:09:33

bob-2$ sudo nova-manage service list
Binary           Host                 Zone             Status     State Updated_At
nova-scheduler   bit-1                nova             enabled    XXX   2012-02-10 04:09:52
nova-compute     bit-2                nova             enabled    :-)   2012-02-10 04:09:35
nova-compute     bit-3                nova             enabled    :-)   2012-02-10 04:09:34
nova-compute     bit-4                nova             enabled    :-)   2012-02-10 04:09:28
nova-network     bit-2                nova             enabled    :-)   2012-02-10 04:09:34
nova-network     bit-3                nova             enabled    :-)   2012-02-10 04:09:34
nova-network     bit-4                nova             enabled    :-)   2012-02-10 04:09:33

原因は時間。bob-1 が20秒ほど未来を見ていた。これが原因でステータスが取れなかった模様。

Nova は死活監視を「Updated_At」で判断している。この差がある場合は死亡と判断し、停止とみなされる。

疑問: Nova Service テーブル

Updated_At 更新のタイミングで report_count int(11) がカウントアップされている?
サービスを増やしまくって、PostgreSQL を利用する場合には pg_dump を忘れないように。

各種デーモンの起動などに失敗する

設定ファイルの解析に潜む罠がありました。

/etc/nova/nova.conf の rabbit_password  などにパスワードとして $ を含めることが多々あると思いますが、$ 挿入場所によっては問題が生じるようです。

今回、RabbitMQ のパスワードを以下のように設定をしていました。

rabbit_password=7wNFD$L

この状態で nova-manage network create private ~~~ や nova 関連デーモンの起動をすると、以下のようなエラーが出ます。

(2012/03/13 時点のソースでは出力場所は違うものの同様の事象が発生)

2012-03-13 16:26:29,810 CRITICAL nova [-] 'L'
(nova): TRACE: Traceback (most recent call last):
(nova): TRACE:   File "/usr/local/bin/nova-manage", line 5, in <module>
(nova): TRACE:     pkg_resources.run_script('nova==2011.3.2', 'nova-manage')
(nova): TRACE:   File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 467, in run_script
(nova): TRACE:     self.require(requires)[0].run_script(script_name, ns)
(nova): TRACE:   File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 1200, in run_script
(nova): TRACE:     execfile(script_filename, namespace, namespace)
(nova): TRACE:   File "/usr/local/lib/python2.7/dist-packages/nova-2011.3.2-py2.7.egg/EGG-INFO/scripts/nova-manage", line 2149, in <module>
(nova): TRACE:     main()
(nova): TRACE:   File "/usr/local/lib/python2.7/dist-packages/nova-2011.3.2-py2.7.egg/EGG-INFO/scripts/nova-manage", line 2137, in main
(nova): TRACE:     fn(*fn_args, **fn_kwargs)
(nova): TRACE:   File "/usr/local/lib/python2.7/dist-packages/nova-2011.3.2-py2.7.egg/EGG-INFO/scripts/nova-manage", line 811, in create
(nova): TRACE:     net_manager = utils.import_object(FLAGS.network_manager)
(nova): TRACE:   File "/usr/local/lib/python2.7/dist-packages/nova-2011.3.2-py2.7.egg/nova/utils.py", line 78, in import_object
(nova): TRACE:     return cls()
(nova): TRACE:   File "/usr/local/lib/python2.7/dist-packages/nova-2011.3.2-py2.7.egg/nova/network/manager.py", line 343, in __init__
(nova): TRACE:     self.driver = utils.import_object(network_driver)
(nova): TRACE:   File "/usr/local/lib/python2.7/dist-packages/nova-2011.3.2-py2.7.egg/nova/utils.py", line 74, in import_object
(nova): TRACE:     __import__(import_str)
(nova): TRACE:   File "/usr/local/lib/python2.7/dist-packages/nova-2011.3.2-py2.7.egg/nova/network/linux_net.py", line 1019, in <module>
(nova): TRACE:     interface_driver = utils.import_object(FLAGS.linuxnet_interface_driver)
(nova): TRACE:   File "/usr/local/lib/python2.7/dist-packages/nova-2011.3.2-py2.7.egg/nova/flags.py", line 143, in __getattr__
(nova): TRACE:     self.ParseNewFlags()
(nova): TRACE:   File "/usr/local/lib/python2.7/dist-packages/nova-2011.3.2-py2.7.egg/nova/flags.py", line 128, in ParseNewFlags
(nova): TRACE:     setattr(self, k, getattr(new_flags, k))
(nova): TRACE:   File "/usr/local/lib/python2.7/dist-packages/nova-2011.3.2-py2.7.egg/nova/flags.py", line 148, in __getattr__
(nova): TRACE:     return tmpl.substitute(StrWrapper(context))
(nova): TRACE:   File "/usr/lib/python2.7/string.py", line 172, in substitute
(nova): TRACE:     return self.pattern.sub(convert, self.template)
(nova): TRACE:   File "/usr/lib/python2.7/string.py", line 162, in convert
(nova): TRACE:     val = mapping[named]
(nova): TRACE:   File "/usr/local/lib/python2.7/dist-packages/nova-2011.3.2-py2.7.egg/nova/flags.py", line 167, in __getitem__
(nova): TRACE:     raise KeyError(name)
(nova): TRACE: KeyError: 'L'

どうやら $ 以下以降の英字がオプションとして認識されてしまうようです。

※ $$$$ や $000 などでは出ず、$LLL などの場合にのみ発生します。