【问题标题】:Chef 12 Opsworks attributes get overriden by last recipe in run listChef 12 Opsworks 属性被运行列表中的最后一个配方覆盖
【发布时间】:2018-07-30 16:15:00
【问题描述】:

我正在运行 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 层的设置步骤中,我添加了所有备份配方,但是当我启动实例(或从部署运行设置步骤)时出现问题,因为属性似乎设置为最后一个配方按字母顺序设置它们。

因此,例如 SITE1 备份脚本最终将在其配置中使用 /var/www/SITE2 根文件夹构建,因此不会备份正确的站点。

有没有办法防止这种情况发生?根据我收集的信息(从我的示例和阅读 Chef 文档),所有属性在开始时都被编译在一起,然后食谱正在运行 - 这就是为什么最后一组属性被设置为最终版本,然后所有使用这些属性的食谱属性将获得这些值。

目前我可以部署它们的唯一方法是独立运行每个配方,从而使用正确的属性值,但是当实例重新启动或手动运行设置步骤时,所有备份脚本都将返回备份一个站点。

我的处理方法有问题吗?我应该为每个配方创建单独的命名属性吗?

【问题讨论】:

    标签: attributes aws-opsworks chef-infra


    【解决方案1】:

    在阅读有关“主厨运行”过程的更多信息后,我通过稍微修改使用属性的方法最终解决了这个问题。

    我仍在为所有配方之间的实际“通用”属性使用属性,但是在每个配方中,我没有覆盖配方特定属性,而是将它们替换为本地 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
    

    这样我可以在我的配置模板中保留相同的变量名称,但让每个备份配方都使用自己的自定义变量,而不会干扰其他配方。

    【讨论】:

      猜你喜欢
      • 2016-04-24
      • 2014-09-06
      • 1970-01-01
      • 2020-10-08
      • 2016-02-29
      • 2018-09-02
      • 2013-01-15
      • 1970-01-01
      • 2012-12-03
      相关资源
      最近更新 更多