smallpalace's blog

鯖缶主婦の日々の記録です

Chef-Soloでレシピ適用時のエラーまとめ

おつかれさまです。

Chefを試していて初心者のくせにいろいろ試そうとして、なんとなく人よりたくさんのエラーに遭遇している感じで私だけじゃもったいないからご紹介を。

Chef-Soloでレシピ適用時のエラーまとめです。

同じところで詰まるひとも少ないかもしれないのですが役に立ったらラッキーってことで。

 

・Roleのパスかいてなかったエラー

[2013-06-21T14:36:36+09:00] FATAL: Chef::Exceptions::MissingRole: The expanded run list includes nonexistent roles: webserver

knife.rbにrole_path '/root/chef-repo/roles'を追加したらでなくなりました

 

・RoleのJSONシンタックスがひどいエラー

[2013-06-21T14:51:28+09:00] FATAL: Yajl::ParseError: lexical error: invalid char in json text.

  "default_attributes":{

    "base_setting" => {

        "swappiness" => "30",

上記を以下のように直したら出なくなりました

  "default_attributes":{

    "base_setting": {

        "swappiness": "30",

 

json_verifyというコマンドを入れてシンタックスをチェックするとよいですよ。 

コマンドラインでJSONを扱う際ユーティリティ、yajl-toolsとjson_pp(jsonpp) - Qiita

 

・存在しないリソースメソッドのエラー

[2013-06-21T15:05:25+09:00] FATAL: NoMethodError: undefined method `groups' for Chef::Resource::User

以下のように直したらでなくなりました。

  9>>     groups u['groups']

  ↓

    group u['groups']

 

・サブグループをuserリソースで追加できると思ってた勘違いによるエラー

[2013-06-21T15:11:13+09:00] FATAL: Chef::Exceptions::ValidationFailed: Option gid must be a kind of [String, Integer]!  

userリソースからgidは外して、groupリソースでサブグループを定義しました。

group 'wheel' do

  group_name 'wheel'

  members ['root', 'xxx-op', 'yyy-op', 'xxxdev']

  action :modify

end

 

ちゃんとマニュアルみたほうがいいという。

Resources and Providers Reference — Chef Single-page Topics

 

・Serviceリソースでサポートしてるアクションを確認してなかったエラー

[2013-06-21T15:52:06+09:00] FATAL: NoMethodError: undefined method `reload' for Chef::Resource::Service

以下を消したらでなくなりました。

, :force-reload => :true

 

・cookbook_fileリソースのパスが違ってたエラー

[2013-06-21T15:58:46+09:00] FATAL: Chef::Exceptions::FileNotFound: template[/etc/hosts] (base_setting::hosts line 1) had an error: Chef::Exceptions::FileNotFound: Cookbook 'base_setting' (0.1.0) does not contain a file at any of these locations:

パス直したらでなくなりました。

 

・日本語を含む設定ファイルをtemplateリソースで用いたのでエンコード指定が必要だったエラー

[2013-06-21T16:09:03+09:00] FATAL: ArgumentError: invalid byte sequence in US-ASCII

http://blog.prvten.com/?p=406

Encoding.default_external = Encoding::UTF_8

上記をtemplateリソースのレシピに追記したらでなくなりました。

日本語を含む設定ファイルはエンコーディングを指定する必要があった模様です。

 

・templateリソースの仕組みをあんまり理解してなかったエラー

[2013-06-25T16:13:57+09:00] FATAL: NoMethodError: undefined method `[]' for nil:NilClass

attributes/default.rbにデフォルト値を定義したらでなくなりました。

http://tech.blog.piyo.org/2012/05/23/chef-attribute%E3%81%AE%E7%90%86%E8%A7%A3/

http://qiita.com/kenjiskywalker/items/c16afc2f8ac28765da91

http://docs.opscode.com/chef/resources.html#template

要は、templateリソースでレシピ書いて、templatesに変数入りファイル置いて、attributesでデフォルト値定義して、roleかnodeでattributeを個別に定義する感じです。

 

・scriptリソース内でcdせずにtar展開してファイルが続くコマンドでファイルが見つからないエラー

[2013-06-25T18:53:19+09:00] FATAL: Mixlib::ShellOut::ShellCommandFailed: script[install_httpd_php] (httpd::httpd-server line 7) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'

---- Begin output of "bash"  "/tmp/chef-script20130625-27819-v6q8zk" ----

STDOUT:

STDERR: error: File not found by glob: /tmp/web-rpm/httpd-2.2.3-65/httpd*

error: File not found by glob: /tmp/web-rpm/php5.3.17/*

cd指定したらでなくなりました。同様のエラー複数回

 

・scriptリソースでインストール時に依存関係に失敗してるエラー

STDERR: warning: web-rpm/php5.3.17/libcurl-7.21.7-5.el5.remi.2.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID 00f97f56

error: Failed dependencies:

        libmysqlclient.so.18()(64bit) is needed by php-mysql-5.3.17-1.el5.remi.x86_64

実環境にログインして手動で入れてみて入ったら消してレシピを書きなおす感じででなくなりました。同様のエラーが複数回

 

・ディレクトリが存在しなかったエラー

[2013-06-26T14:39:12+09:00] FATAL: Chef::Exceptions::EnclosingDirectoryDoesNotExist: cookbook_file[/opt/bin/mem_monitor.sh] (zabbix::zabbix-agent line 32) had an error: Chef::Exceptions::EnclosingDirectoryDoesNotExist: Parent directory /opt/bin does not exist.

directoryリソースを足したら終わりまで動きました(webserverのroleだけ)

 

not_ifとか確認しながら追加したりなど。

 

サードパーティレシピを使って出たエラー

[2013-06-26T15:22:38+09:00] FATAL: NameError: uninitialized constant Chef::Recipe::Opscode

ERROR: RuntimeError: chef-solo failed. See output above.

opscodeのレシピのトレースとか高度すぎるので外部レシピ使わずにいさぎよくscriptでいくことにしました。。mysql_database_userというリソースを使いたかったんだけど。他人が作ったレシピって余計なこといっぱいしてるし。

 

・serviceリソースでmysqldが起動しないエラー

[2013-06-26T17:02:47+09:00] FATAL: Mixlib::ShellOut::ShellCommandFailed: service[mysqld] (mysqld::mysqld-server line 48) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'

これはmy.cnfで指定してたinnodb_buffer_pool_sizeがmicroなのに1700Mとかあったためで、100Mにしたら起動しました。てへぺろ

 

・scriptリソースでのユーザ追加失敗してるエラー

[2013-06-27T17:09:15+09:00] FATAL: Mixlib::ShellOut::ShellCommandFailed: script[create_msql_xxdbadm] (mysqld::mysql-users line 33) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'

これはdata_bagsの鍵を転送しわすれてるから起きたエラーかと思いきや、scriptリソース内でヒアドキュメントしてるEOFが行頭でなかったためのようでした。たぶん。

 

・scriptリソースで既にインストールされてるパッケージを入れようとしてエラーになる

STDERR: package perl-DBI-1.52-2.el5.x86_64 is already installed

対策としては、

 package "perl-DBI" do

  not_if "rpm -qa|grep perl-DBI"

  action :install

end

packageリソース切り出してnot_ifつけるくらいしか思いつかず場当たり的なんですが他にいい方法ないのかなとは思います。

 

・配列アトリビュートがdeepmergeされる

roleのattributeをenvironmentで上書きしたかったんだけど配列attributeに空の値が追加されるという現象が起きました。

対策を書きました。

chefの配列attributeがdeepmergeされる対策 - Qiita

 

・1回目は失敗するけど2回目は成功する

rbenvでruby入れるのをレシピにしてたらこうなりました。ruby_blockでENVを読み込みし直さないといけなかったようでした。

Rubyを知らずにchefでrecipeを書くときのTips - 右往左往ブログ

あとホスト名を付け直した時にも。

chef-solo - ohaiのhostnameの利用方法について - Qiita

あとruby_block内でリソース呼びたい場合に以下が参考になりそうです。

chef の ruby_block 内でリソースを実行する - Qiita

 

最初にマニュアルちゃんと読んで理解できる人やユニットテストちゃんとする人はこういうエラーにあたりづらい気もします。

上記の環境はもちろん検証環境です。

ご参考まで。

こちらも参考にどうぞ。

ChefTips - Meta Search

 

みていただいてありがとうございました。

 ちゃんとした手順的なのは会社のブログに書くと思います。

またそのうちに。