我有一个配方可以启动可由环境变量配置的服务。看看如何设置变量(将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。
答案 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重新启动。