我正在运行Chef 12 Opsworks堆栈,我创建了一个自定义食谱,以便在我的网络服务器上对一些文件夹进行一些备份。
也许我对此的处理方法是错误的,但我基本上有两个(或更多)配方用于我想要备份的每个网站,然后我在每个配方中更新一些属性(网站名称,备份文件夹等)
所以我从属性文件夹中的default.rb文件开始:
default['backup']['site'] = "SITE1"
default['backup']['root'] = "/var/www/SITE1"
然后在每个备份配方中,我在配方的顶部跟随以下备份代码:
site1.rb
node.override['backup']['site'] = "SITE1"
node.override['backup']['root'] = "/var/www/SITE1"
site2.rb
node.override['backup']['site'] = "SITE2"
node.override['backup']['root'] = "/var/www/SITE2"
现在在Opsworks Layer上的我的安装步骤中添加了所有备份配方,但是当我启动实例(或从部署运行安装步骤)时出现问题,因为属性似乎设置为最后一个配方按字母顺序设置它们。
因此,例如,SITE1备份脚本最终将在其配置中使用/var/www/SITE2
根文件夹构建,因此无法备份正确的站点。
有没有办法防止这种情况发生?从我收集的内容(从我的示例和阅读Chef文档)开始,所有属性都在一起编译,然后运行配方 - 这就是为什么最后一组属性被设置为最终版本然后使用这些属性的所有配方属性将获得这些值。
我现在可以部署它们的唯一方法是独立运行每个配方,从而使用正确的属性值,但是当实例重新启动或手动运行安装步骤时,所有备份脚本将返回备份一个网站。
我接近这个错误吗?我应该为每个食谱创建单独的命名属性吗?
答案 0 :(得分:0)
我最后通过稍微修改我使用属性的方法来解决这个问题,然后阅读更多关于'厨师运行'流程的信息。
我仍然在所有配方之间使用属性来实现“常见”属性,但是在每个配方中,而不是覆盖配方特定属性,我用局部ruby变量替换它们,然后通过'传递给我的'模板'变量的属性。
所以我的site1.rb配方看起来如下:
site = "SITE1"
root = "/var/www/SITE1"
...
config = {
:site => site,
:root => root,
...
}
...
template "/path/to/config" do
source "config.erb"
variables(
:config => config
)
...
end
这样我就可以在配置模板中保留相同的变量名,但每个备份配方都使用自己的自定义变量而不会干扰其他配方。