0

AWS OpsWorks を使用してアプリケーションを正常にデプロイしました。現在、bash 環境変数を設定できるカスタム Chef Cookbook を実装しようとしています。OpsWorks でクックブックを更新する Git リポジトリをセットアップしました。私は開発ボックスでknifeコマンドを使用してクックブックを生成しました。これは、実際にはrecipes/default.rb数行のコードを含むファイルを含むディレクトリ構造にすぎません。

次のようなことをしようとすると、エラーが発生し続けるようです

node[:deploy].each do |application, deploy|
    deploy = node[:deploy][application]
    command "ls -la"
end

(注:ls -laはテスト用です。これにより環境変数が設定されないことがわかっています)

次のエラーが表示されます。ERROR: Caught exception during execution of custom recipe: xyz-enviroment: NoMethodError - undefined method command' for #<Chef::Recipe:0x7feb59200c00> - /opt/aws/opsworks/releases/20130328224322_109/vendor/bundle/ruby/1.8/gems/chef-0.9.15.5/bin/../lib/chef/mixin/recipe_definition_dsl_core.rb:56:in method_missing

また、次のようなことを試してみると

execute "setting up the enviroment" do
    # TODO: Add code that does something here
end

次のエラーが表示されます。

execute[setting up the enviroment] (/opt/aws/opsworks/current/site-cookbooks/xyz-enviroment/recipes/default.rb:18:in `from_file') had an error:
No such file or directory - setting up the enviroment

私はChefを初めて使用するので、単純に間違っていることがあると確信しています。それを理解できていません。助けてくれてありがとう。

4

5 に答える 5

4

以下の回答を見る前に、私はすでに問題を解決しました。問題を解決するために機能した可能性がありますが、戻って今すぐ試す時間がありません。

私の解決策は、Chef テンプレートを使用してイニシャライザ ファイルを作成し、レールがアプリケーションを起動するときに変数を設定することでした。

# deafult.rb

node[:deploy].each do |application, deploy|
    deploy = node[:deploy][application]

    execute "restart Rails app #{application}" do
        cwd deploy[:current_path]
        command node[:opsworks][:rails_stack][:restart_command]
        action :nothing
    end

    template "#{deploy[:deploy_to]}/current/config/initializers/dev_enviroment.rb" do
        source "dev_enviroment.erb"
        cookbook 'dev-enviroment'
        group deploy[:group]
        owner deploy[:user]
        variables(:dev_env => deploy[:dev_env])

        notifies :run, resources(:execute => "restart Rails app #{application}")

        only_if do
            File.exists?("#{deploy[:deploy_to]}") && File.exists?("#{deploy[:deploy_to]}/current/config/")
        end
    end
end

dev_enviroment.erb

ENV['VAR1'] = "<%= @dev_env[:VAR1] %>"
ENV['VAR2'] = "<%= @dev_env[:VAR2] %>"

Opsworks スタック レイヤーで使用されるカスタム Chef JSON:

{
    "deploy": {
        "myapp": {
            "dev_env": {
                "VAR1": "INFO1",
                "VAR2": "INFO2",
            }
        }
    }
}
于 2013-04-09T14:25:35.880 に答える
2

2 番目の質問は clb によって正しく回答されました。最初に、「コマンド」は有効なシェフのリソースではありません。次のようなものが必要です。

node[:deploy].each do |application, deploy|
  deploy = node[:deploy][application]
  execute "running a command for #{application}" do
    command "ls -la"
  end
end
于 2013-04-09T01:42:13.110 に答える
2

実行するコマンドを指定しなかったため、実際にsetting up the environmentは有効なコマンドではない を実行しようとしています。

代わりcommandに、ブロック内で属性を指定してみてください:

execute "setting up the enviroment" do
  command "/path/to/command --flags"
end

または、リソース名をコマンド自体に設定します。

execute "/path/to/command --flags" do
  # TODO: Add code that does something here
end
于 2013-04-09T01:10:25.213 に答える
1

OpsWorks には、アプリに環境変数を追加できる新機能があります

経由でアクセスできます

node[:deploy]['appshortname'][:environment_variables][:variable_name]

( http://docs.aws.amazon.com/opsworks/latest/userguide/attributes-json-deploy.html#attributes-json-deploy-app-environmentを参照)

したがって、次のようにシェフのコンテキストに直接設定できます。

node[:deploy]['magento']['environment_variables'].each {|key, value| ENV[key]=value }

そして、たとえば次のように、それをシェルスクリプトに「ダンプ」できます。

file "#{release_path}/environment.sh" do
  content ENV.reduce("#!/bin/bash\n") { |a, e| a + "export #{e[0]}=\"#{e[1]}\"\n" }
  mode '0775'
end
于 2014-11-06T18:26:11.693 に答える
0

同様のことを行い、環境変数を Opsworks ダッシュボードの json 構成ファイルに追加することで解決しました。Chef では、デプロイ時に次のテンプレートを使用してファイルを作成します: https://github.com/octocall/opsworks-cookbooks/blob/34e60267a4d3b5b9cf84e91829cc80c98c26f8ed/deploy/definitions/opsworks_rails.rb#L26 。 " 次のような json ファイルのプロパティ:

{
  "deploy": {
    "APPNAME": {
      "symlink_before_migrate": {
        "config/.env": ".env"
      }
    }
  }
}
于 2013-10-19T17:53:17.777 に答える