3

次のノード定義があります。

{
    "prestashop_sites" : {
       "site1": { "username": "dave", "password" :"password123", "URL":"www.madeup.com" },
       "site2": { "username": "dave2", "password" :"password12", "URL":"www.madeup2.com" }
    },
       "run_list": [
       "recipe[prestashop]"
    ]
}

そしてレシピ:

node["prestashop_sites"].each do |site|
        username site['username']
        Chef::Log.debug("Found a server: #{site['username']}")
end

remote_file "/tmp/prestashop152.zip" do
        source "http://www.prestashop.com/download/old/prestashop_1.5.2.0.zip"
        mode "0644"
        checksum "37aee9ef5388376e4377aeb240ab027e"
        backup false
        not_if "test -f /tmp/prestashop152.zip"
end

execute "unzip -o /tmp/prestashop152.zip -d #{node[:prestashop][:location]}" do
        not_if "test -f /var/www/#{node[:prestashop][:user]}/prestashop/index.php"
end

したがって、私の目標は、prestashop のいくつかのインスタンスをインストールすることです (スクリプトを完了した後)。

しかし、私は立ち往生しています:

10:  node["prestashop_sites"].each do |site| 
11>>    Chef::Log.debug("Found a server: #{site['username']}")
12:  end

Mon, 12 Nov 2012 21:26:14 +0100] DEBUG: Re-raising exception: 
                                        TypeError - can't convert String into Integer

理由はわかりますか?

4

1 に答える 1

5

配列ではなく、*node["prestashop_sites"]* のサブ要素としてハッシュがあります。したがって、メソッドに 2 つの変数を提供する必要があります。1 はキー用、もう 1 つは値用です。

10>>!  node["prestashop_sites"].each do |key, site| 
11:    Chef::Log.debug("Found a server: name: #{key}, #{site['username']}")
12:  end

最初のサイトの「サーバーが見つかりました: 名前: サイト 1、デイブ」が出力されます。

あなたが得る「奇妙な」エラー: TypeError - can't convert String into Integerは、各メソッドに変数を 1 つだけ指定すると、Ruby がキーと値の両方をその変数に入れようとするためです。割り当てられた [key, value] の値を終了します。これは、あなたの場合、それを意味します

サイト== ["サイト", { "ユーザー名": "デイブ", "パスワード" :"password123", "URL":"www.madeup.com" }]

実際には配列であり、整数ではなく文字列インデックスを使用して配列要素にアクセスしようとしています。

于 2012-11-12T21:41:58.860 に答える