如何在Chef模板中使用OpsWorks App Data Bag(aws_opsworks_app)环境变量?

时间:2016-02-01 22:18:44

标签: chef gunicorn aws-opsworks databags

鉴于厨师12最近发布了OpsWorks的支持 - 我找到的所有文件都是针对Chef 11的。所以,这是我目前的设置:在OpsWorks上使用Chef 12烧瓶+ gunicorn + nginx。我使用Upstart启动Gunicorn使用模板:

start on runlevel [2345]
stop on runlevel [!2345]

respawn
setuid <%= node['conf-cookbook']['gunicorn_user'] %>
setgid <%= node['conf-cookbook']['gunicorn_group'] %>

env MAIL_SERVER="email-smtp.us-east-1.amazonaws.com"
env MAIL_USERNAME="[redcacted]"
env MAIL_PASSWORD="[redacted]"

chdir <%= node['conf-cookbook']['app_dir'] %>

exec gunicorn --workers 3 --bind unix:<%= node['conf-cookbook']['gunicorn_socket'] %> -m 007 --log-file <%= node['conf-cookbook']['gunicorn_logfile']%> manage:app

我必须在模板中包含敏感的环境变量信息。在OpsWorks Chef 12中,可以使用App Data Bag(aws_opsworks_app)指定环境变量,并使用部署配方中的内容进行检索(从未尝试过 - 是否正确):

app = search(:aws_opsworks_app).first
app['environment']['MAIL_SERVER']

我想使用app数据包环境变量来替换我在模板文件中定义的那些并且不知道如何。任何人都可以帮忙吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以将任意变量数据传递给Chef模板资源:

template '/etc/init/myapp.conf' do
  source 'myapp.conf.erb'
  variables node['conf-cookbook'].merge(app)
end

然后让你的模板看起来更像这样:

start on runlevel [2345]
stop on runlevel [!2345]

respawn
setuid <%= @gunicorn_user %>
setgid <%= @gunicorn_group %>

<%- @environment.each do |key, value| -%>
env <%= key %>="<%= value %>"
<%- end -%>

chdir <%= @app_dir %>

exec gunicorn --workers 3 --bind unix:<%= @gunicorn_socket %> -m 007 --log-file <%= @gunicorn_logfile %> manage:app

另请查看poise-serviceapplication_python食谱,这些食谱分别有编写Upstart配置文件和Gunicorn服务的助手。