実行時にいくつかの属性をchef-client
に渡したかった。同じことをする方法はありますか?私はchef-client -j
オプションを調べていましたが、私の知る限り、それを使用してrun_listを指定できます。いくつかの属性を渡すことはできますか?はいの場合、どのように?
はい、-j
jsonファイルオプションを使用してノード属性を設定できます。
{
"my_attribute": "I like attributes!"
}
これにより、my_attribute
という名前の属性がクックブックで使用できるようになります。例えば、
Chef::Log.info(node['my_attribute'])
または、
if node['my_attribute'] =~ /like/
package "foo-likes-attributes" do
action :install
end
end
初期run_listの設定は、Chef Clientのjson属性ファイルの最も一般的な使用法です。ただし、Chef Client + Chef Serverを使用している場合は、webui(オープンソースChef Server)または管理コンソール(Opscode Hosted/Private Chef)を介して、またはknife node edit
を介してサーバー上のノードオブジェクトを変更できます。コマンドラインツール、ナイフを使用します。
JSONファイルの使用は、サーバー上のノードオブジェクトを変更するようなものであり、ここで設定された属性は、レシピで使用されるときのように「通常」の優先順位であり、これらの属性値はNodeオブジェクトに保存されます。正常な実行の最後にサーバー上で。
コマンドラインでそれを行うことができますが、特にナイフの実行では、それは非常に不気味に見え始めます:
_chef-client \
-o vmware-tools \
--force-formatter \
-j '<(echo {\"vmware-tools\":{\"style\":\"rpm\"}})'
_
しかし、ここでは、-jと<(notation)
を利用して、ナイフ(またはここではssh-i)を介してアーティファクトを投げ込んだJSONファイルをオンザフライで作成しています。あなたがそれをしなければならない場合、リスクは、競合する区切り文字があなたがそれを機能させる頃に狂ってしまうことです。
属性を使用する理想的な方法は、クックブックまたはデータバッグに属性を書き込むことです。いずれかのファイルの場所は次のとおりです。
|- chef-repo
|---- cookbooks
|------- attributes
|---------- default.rb
|------- recipes
|---------- default.rb
|---- data_bags
|------- users
|---------- john.json
|---------- susan.json
|------- databases
|----------- master.json
|----------- slave.json
データを基本的なJSON形式でデータバッグファイルに保存できます(knife create data_bag users
)。
$ knife data bag create users john
{
"id" : "john"
"age" : "27"
"height" : "60in"
}
データバッグを使用することを選択した場合(このコンテキストでは、さまざまなユーザーまたはデータベースサーバーが多数ある場合は、これらをお勧めします)、詳細情報を https://docs.getchef.com/dsl_recipe_method_data_bagで確認できます) .html 。さらに、data_bagsディレクトリにusers
ディレクトリを作成し、そこにユーザー.jsonファイル(〜/ chef-repo/data_bags/users/john.json)を上記の内容で作成してからアップロードする方が簡単です。 chefサーバーへのデータバッグ:knife data bag from file users /path/to/data_bags/users/john.json
属性ファイルにデータを保存することもできます。
$ vi ~/chef-repo/cookbooks/my-cookbook-name/attributes/default.rb
default['my-cookbook-name']['user-1'] = "John"
default['my-cookbook-name']['user-1']['age'] = "27"
default['my-cookbook-name']['user-1']['height'] = "60in"
$ vi ~/chef-repo/cookbooks/my-cookbook-name/default.rb
template "/root/user-list" do
action :create
source "user-list.erb"
end
$ vi ~/chef-repo/cookbooks/my-cookbook-name/templates/default/user-list.erb
<html>
<head>
<title>My User List</title>
</head>
<body>
<h1>User List</h1>
User 1: <%= node['my-cookbook-name']['user-1'] %>
User Age: <%= node['my-cookbook-name']['user-1']['age'] %>
User Height: <%= node['my-cookbook-name']['user-1']['height'] %>
</body>
</html>