【问题标题】:How to set an environment variable in crontab using Chef?如何使用 Chef 在 crontab 中设置环境变量?
【发布时间】:2012-10-08 05:23:35
【问题描述】:

我有一个将作业设置为从 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 顶部设置环境变量?任何见解表示赞赏!谢谢。

【问题讨论】:

    标签: ubuntu amazon-ec2 chef-infra chef-recipe


    【解决方案1】:

    我相信您正在寻找的答案是 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 '}' 不是说你应该直接传入哈希值,但我认为值得一提,因为其他人可能会重复我同样的错误。只要将哈希值放入变量中,一切都会按预期进行。

    【讨论】:

    • 我读了你的答案,掩盖了你的笔记,然后直接在哈希中直接犯了同样的错误。如果您将哈希语法包装在括号中,它也可以工作,如下所示:environment({'env1' => 'val1'})
    【解决方案2】:

    具有与您的环境相对应的顶级密钥的数据包。 Opscode wiki 对如何执行此操作进行了快速且中肯的描述。 Data Bags and Environments 根据您之前的示例:

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

    或者,如果您想变得花哨,可以将Templates 与您的数据包一起使用,然后在配方中调用您的模板。当您让 crontab 使用不同的变量调用相同的函数时,这将适用。这样您就可以在需要时随时编辑模板,它会反映在不同的环境中。

    【讨论】:

    • 您将 Chef 的环境概念与 shell 的环境概念混为一谈。 OP 希望像在 crontab 顶部那样设置环境变量——不要在 cron 资源中使用 Chef 环境属性。
    猜你喜欢
    • 2013-06-30
    • 2011-09-11
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2021-04-09
    相关资源
    最近更新 更多