厨师警告在配方中设置ENV时设置密钥

时间:2018-05-18 08:52:03

标签: chef

我有一个配方可以启动可由环境变量配置的服务。看看如何设置变量(将bash脚本添加到/etc/profile.d没有做到这一点),我遇到How to set environment variable using Chef?并配置了一个rb文件设置变量:

vars.rb:

ENV["foo"] = "bar"

myrecipe.rb:

require "/path/to/vars.rb"

service "someservice" do
  action :restart
end

当我运行时,我得到以下内容:

WARN -- : You are setting a key that conflicts with a built-in method Hashie::Mash#default defined in Hash. This can cause unexpected behavior when accessing the key via as a property. You can still access the key via the #[] method

这是为服务设置变量的最佳方法吗?警告是否可以接受?我怎样才能让它干净利落?

Chef是版本12.04。

2 个答案:

答案 0 :(得分:1)

错误表示您尝试与内置密钥设置冲突的密钥。因此,之后使用密钥可能会产生意外结果。如果可能,请尝试使用其他密钥名称。

另外。在/etc/profile.d中设置变量用于交互式shell。服务未运行交互式shell,因此不会获取这些变量。此外,您在Chef运行中设置的任何环境变量都不会持续存在(如果这是一个要求)

假设您正在运行 systemd 系统。您应该使用单元文件中的Environment=EnvironmentFile=设置服务变量。例如,这类似于我设置的内容:

<强> someservice.service.erb

[Unit]
Description=Someservice Server
After=network.target

[Service]
User=someservice
Environment="SOMESERVICE_OPTS=-someoption -someotheroption"
ExecStart=/srv/someservice/bin/someservice-server.sh run
ExecStop=/srv/someservice/bin/seomservice-server.sh stop

[Install]
WantedBy=multi-user.target

使用Chef,然后我将此文件复制到正确的位置,并确保systemctl守护程序重新加载systemctl daemon-reload

如果这是一个基于init的系统,您需要在某处创建一个环境文件,并在init脚本中提供该文件,如:

. /etc/default/someservice
<remaining init script>

然后确保使用Chef将该环境文件和新的init脚本放在服务器上。

答案 1 :(得分:0)

我忽略的一点是变量的值在一个文件中,只有在处理完资源后才能使用(一个提取tarball的bash资源)。所以我甚至无法在第一阶段访问这些变量。

我没有使用在厨师运行开始时不存在的vars.rb,而是将其更改为导出变量的vars.sh,并使用以下内容将通知添加到另一个bash资源代码:

bash "extract_archive" do
    code "tar zxf archive.tar.gz"
    notifies :run, "bash[restart_with_vars]", :delayed
end

bash "restart_with_vars" do
    code <<EOF
    source vars.sh
    appname restart
EOF
    action :nothing
end

已解决的运行列表后面的service "appname"启动时没有vars,但是bash会添加到资源列表的末尾并使用vars重新启动。