我似乎无法解决在我的attributes/default.rb
文件中处理类似命名属性的主厨错误。
我有2个属性:
default['test']['webservice']['https']['keyManagerPwd'] = 'password'
...
...
default['test']['webservice']['https']['keyManagerPwd']['type'] = 'encrypted'
请注意,直到最后一个括号(['type']
),名称都相同。
我在模板和配方中的模板块中引用这些属性。当我去运行它时,我收到了这个错误:
==================================================[0m
I, [2015-01-28T13:36:43.668692 #7920] INFO -- core-14-2-centos-65:
[31mRecipe Compile Error
in /tmp/kitchen/cache/cookbooks/avx/attributes/default.rb[0m
I, [2015-01-28T13:36:43.669192 #7920] INFO -- core-14-2-centos-65:
=================================================================[0m
I, [2015-01-28T13:36:43.669192 #7920] INFO -- core-14-2-centos-65:
I, [2015-01-28T13:36:43.669692 #7920] INFO -- core-14-2-centos-65:
[0mIndexError[0m
I, [2015-01-28T13:36:43.669692 #7920] INFO -- core-14-2-centos-65: -------
--[0m
I, [2015-01-28T13:36:43.669692 #7920] INFO -- core-14-2-centos-65: string not matched[0m
I, [2015-01-28T13:36:43.670192 #7920] INFO -- core-14-2-centos-65:
I, [2015-01-28T13:36:43.670192 #7920] INFO -- core-14-2-centos-65:
[0mCookbook Trace:[0m
I, [2015-01-28T13:36:43.670692 #7920] INFO -- core-14-2-centos-65: --------[0m
I, [2015-01-28T13:46:05.101875 #8332] INFO -- core-14-2-centos-65:
[0m113>> default['webservice']['https']['keyManagerPwd']['type'] =
'encrypted'
当唯一的区别是结束时,似乎Chef无法区分2个属性。 如果我通过在名称的前面放置一些独特的文本来修改相同的属性,则根本没有配方问题:
default['test']['1']['webservice']['https']['keyManagerPwd'] = 'password'
...
...
default['test']['2']['webservice']['https']['keyManagerPwd']['type'] = 'encrypted'
将['1']
和['2']
放在那里,就可以解决问题。
我对Chef很新,所以我觉得它只是一些简单的我忽略了。有没有人有任何想法或建议?感谢。
答案 0 :(得分:8)
简单回答:你不能这样做。这不是厨师问题,也不是红宝石问题 - 这是与大多数编程语言一样的普遍问题。
让我们使用foo
作为变量,而不是冗长的default['test']['webservice']['https']['keyManagerPwd']
。
你实际做的是
1: foo = "password"
2: foo['type'] = "encrypted"
在第1行中,foo
是一个字符串。在第2行中,它被视为散列(在其他一些语言中称为数组)。第二行会自动覆盖您的foo = "password"
作业。它与
1: foo = "password"
2: foo = {}
3: foo['type'] = "encrypted"
替代方案是使用
foo['something'] = "password"
foo['type'] = "encrypted"
或翻译成您的代码:
default['test']['webservice']['https']['keyManagerPwd']['something'] = 'password'
default['test']['webservice']['https']['keyManagerPwd']['type'] = 'encrypted'
这应该有用。