如何使用Chef在crontab中设置环境变量?

时间:2012-10-17 20:41:23

标签: ubuntu amazon-ec2 chef chef-recipe

我有一个配方,可以将作业设置为从EC2实例的crontab运行。这是我正在运行的食谱的一个例子:

cron "examplejob" do
 minute "0"
 hour "2"
 command "job"
 user "job"
end

这很有效。除了这个cron作业,我还想在crontab中设置一些环境变量。阅读this,似乎应该可以使用"路径"属性。但是,我无法找到如何实现此功能的具体示例。

我试过了:

cron "env" do
 path "MY_VAR=/path/for/variable"
end

但这不起作用。如何在crontab的顶部设置环境变量?有任何见解赞赏!感谢。

2 个答案:

答案 0 :(得分:5)

我相信你要找的答案是environment属性,它需要一个Hash对象。

请参阅http://docs.opscode.com/chef/resources.html#argumentshttps://github.com/opscode/chef/commit/96ef7d770a7d898fdce097c7fda9039abf7bf485

要设置自定义环境变量,请编写以下内容

my_env_vars = {"env1" => "val1", "env2" => "val2"}    

cron "env" do
 environment my_env_vars
 command "/path/to/job -someoption"
end

Chef将遍历您的哈希,您应该在sudo crontab -e

中看到以下内容
# Chef Name: env
env1=val1
env2=val2
* * * * * /path/to/job -someoption

快速注意:在使用Chef 10.16.2的计算机上,直接在cron节中传入哈希将返回语法错误。 syntax error, unexpected tASSOC, expecting '}'并不是说你应该直接传递哈希值,但我认为值得一提,因为别人可能会重复同样的错误。一旦将哈希值抛出到变量中,一切都按预期工作。

答案 1 :(得分:-1)

带有与您的环境相对应的顶级键的数据包。 Opscode wiki快速而直观地描述了如何做到这一点。 Data Bags and Environments根据您之前的示例:

cron "[node.chef_environment]" do
 path "bag_item[node.chef_environment]["path_for_variable"]"
end

或者,如果您想获得幻想,可以将Templates与数据包一起使用,只需在配方中调用模板即可。当crontab使用不同的变量调用相同的函数时,这将适用。这样,您可以随时编辑模板,并且可以反映各种环境。