如何在CHEF中控制具有角色的属性

时间:2018-04-08 17:16:52

标签: chef chef-recipe cookbook

如何使用角色更改食谱中定义的属性值。

用例:

我有一本食谱

mkdir
├── Berksfile
├── LICENSE
├── README.md
├── attributes
│   └── attribute.rb
├── chefignore
├── metadata.rb
├── recipes
│   └── default.rb
├── spec
│   ├── spec_helper.rb
│   └── unit
│       └── recipes
│           └── default_spec.rb
└── test
    └── integration
    └── default
        └── default_test.rb

在attribute.rb中,我有以下内容:

node.override [' main'] ['目录'] =" rolesquestionserverA"

node.default [' main'] ['目录'] =" rolesquestionserverA"

在recipe / default.rb中,我有以下

bash 'extract_module' do
  code <<-EOH
    mkdir -p /tmp/#{node['main']['directory']}
    EOH
end

现在在服务器A上,我想要一个使用rolesquestionserverA

创建的目录

在服务器B上我想要一个目录createdrolesquestionserverB&#34;

在Roles目录中,我有以下内容:\

name "mkdir"
description "An example Chef role"
run_list "recipe[mkdir]"
override_attributes({
   #"starter_name" => "Test  ",
   "directory" => "rolesquestionserverB"
})

我已将此角色仅添加到服务器B的配方中,但是当它在服务器B上运行时,它不会被覆盖,而只是创建一个与食谱中名称相同但不在角色中的目录 如何使用角色和角色来控制它?属性?还是有更好的方法来实现这个目标?

谢谢

1 个答案:

答案 0 :(得分:0)

"main"未附加到属性结构的顶级。您必须始终使用完整路径。

您的覆盖属性应如下所示:

override_attributes({
   "main" => {
      "directory" => "rolesquestionserverB"
   }
})

您是否考虑过使用the directory resource?在每个示例中放置execute / bash / script没有多大意义,并且它不是Chef的最佳用法。