gpt4 book ai didi

ruby - Chef - 使用动态变量创建模板?

转载 作者:数据小太阳 更新时间:2023-10-29 06:52:39 26 4
gpt4 key购买 nike

我在 Chef Recipe 上遇到了一些挑战。我是 Chef 的新手,所以请多多包涵。

第 1 步:我的 Chef Recipe 安装了 Ruby Passenger,然后将 Passenger nginx 模块与 Nginx 一起编译。

# Install passenger and nginx module
bash "Install Passenger" do
code <<-EOF
source /usr/local/rvm/scripts/rvm
gem install passenger
EOF
user "root"
not_if { `gem list`.lines.grep(/^passenger \(.*\)/).count > 0 }
end

# Install passenger
# Note that we have to explicitly include the RVM script otherwise it won't setup the environment correctly
bash "Install passenger nginx module and nginx from source" do
code <<-EOF
source /usr/local/rvm/scripts/rvm
passenger-install-nginx-module --auto --prefix=/opt/nginx --auto-download
EOF
user "root"
not_if { File.directory? "/opt/nginx" }
end

第 2 步:之后,我使用模板创建 nginx 配置文件。此配置需要 Passenger 的位置,这取决于步骤 1 的完成情况。

template "/opt/nginx/conf/nginx.conf" do
source "nginx.conf.erb"
action :create
variables(
deploy_user: deploy_user,
passenger_root: `bash -c "source /usr/local/rvm/scripts/rvm; passenger-config --root"`.chomp,
passenger_ruby: `bash -c "source /usr/local/rvm/scripts/rvm; which ruby"`.chomp,
passenger: node[:passenger]
)
end

问题:Chef 似乎在运行开始时编译模板。所以最终发生的是第 2 步实际上是在第 1 步运行之前编译的。这意味着 passenger_root 变量为空。它需要完成第 1 步才能获取 passenger_root,然后运行模板。

我尝试将步骤 2 代码包装在 ruby_block 中,但这不起作用:undefined methodtemplate' for Chef::Resource::RubyBlock`。

不确定在这里做什么,或者 Chef 对于此类事情的最佳实践是什么?

提前致谢

伦纳德

最佳答案

更简洁且推荐的方法是使用 Lazy Attribute Evaluation .

template "/opt/nginx/conf/nginx.conf" do
source "nginx.conf.erb"
action :create
variables lazy {
{
deploy_user: deploy_user,
passenger_root: `bash -c "source /usr/local/rvm/scripts/rvm; passenger-config --root"`.strip,
passenger_ruby: `bash -c "source /usr/local/rvm/scripts/rvm; which ruby"`.strip,
passenger: node[:passenger]
}
}
end

此外,我建议使用 strip 而不是 chomp [感谢 Draco]。

关于ruby - Chef - 使用动态变量创建模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15743546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com