Chef infra 当在配方中设置ENV时,Chef警告有关设置键的信息
我有一个配方,可以启动一个可以由环境变量配置的服务。在查看如何设置变量时(将bash脚本添加到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--:您设置的密钥与哈希中定义的内置方
/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重新启动该资源中的
命令。当我不确定服务是如何建立的时候,很难给出更好的建议。