Chef infra 当在配方中设置ENV时,Chef警告有关设置键的信息

Chef infra 当在配方中设置ENV时,Chef警告有关设置键的信息,chef-infra,Chef Infra,我有一个配方,可以启动一个可以由环境变量配置的服务。在查看如何设置变量时(将bash脚本添加到/etc/profile.d并没有做到这一点),我发现并配置了一个rb文件来设置变量: vars.rb: ENV["foo"] = "bar" myrecipe.rb: require "/path/to/vars.rb" service "someservice" do action :restart end 当我运行此操作时,会得到以下结果: WARN--:您设置的密钥与哈希中定义的内置方

我有一个配方,可以启动一个可以由环境变量配置的服务。在查看如何设置变量时(将bash脚本添加到
/etc/profile.d
并没有做到这一点),我发现并配置了一个rb文件来设置变量:

vars.rb:

ENV["foo"] = "bar"
myrecipe.rb:

require "/path/to/vars.rb"

service "someservice" do
  action :restart
end
当我运行此操作时,会得到以下结果:

WARN--:您设置的密钥与哈希中定义的内置方法Hashie::Mash#default冲突。这可能会在通过作为属性访问密钥时导致意外行为。您仍然可以通过#[]方法访问密钥

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


Chef是12.04版。

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

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

假设您正在运行系统d系统。您应该使用单元文件中的
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守护程序重新加载

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

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

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

我忽略了一点,即变量的值位于一个文件中,该文件仅在资源被处理后可用(一个提取tarball的bash资源)。所以我甚至无法在第一阶段访问这些VAR

我没有使用chef运行开始时不存在的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
bash“提取\u存档”执行
代码“tar zxf archive.tar.gz”
通知:运行,“bash[使用变量重新启动\u],:延迟
终止
bash“用变量重新启动”do

代码服务没有利用任何标准服务系统-应用程序的cookbook定义了它自己的服务处理程序,这基本上使init命令
appname
-因此
操作:restart
导致运行
appname restart
appname
#散列/usr/bin/env/usr/local/openresty/bin/resty
我对它不太熟悉-希望最好使用一个环境变量…您可以通过使用
bash
execute
资源来解决这个问题,并使用
environment
属性在散列中定义变量,然后运行
appname重新启动该资源中的
命令。当我不确定服务是如何建立的时候,很难给出更好的建议。