Chef infra 在chef custom resource中,如何指定键值对是必需的

Chef infra 在chef custom resource中,如何指定键值对是必需的,chef-infra,lwrp,Chef Infra,Lwrp,在chef中编写自定义资源时,我们定义属性、它们的类型、它们的默认值以及它们是否必须指定,例如 属性:plugin,种类:String,必需:true 属性:after\u plugin,kind\u of:String,required:false,:default=>'pam\u unix.so' 假设我需要取一个散列式的属性 attribute:after,kind\u of:Hash,required:false,:default=>{search\u interface=>nil,:

在chef中编写自定义资源时,我们定义属性、它们的类型、它们的默认值以及它们是否必须指定,例如

属性:plugin,种类:String,必需:true
属性:after\u plugin,kind\u of:String,required:false,:default=>'pam\u unix.so'
假设我需要取一个散列式的属性

attribute:after,kind\u of:Hash,required:false,:default=>{search\u interface=>nil,:search\u control=>nil,:search\u plugin=>nil}
这里我提到了
required:false
,这意味着用户不必提供散列

我需要指定,如果给定了哈希,那么
:search\u接口
是必需的

如何实现这一点?

在定义属性(现在命名为属性)时,可以定义用于验证用户输入的回调

有关示例,请参见

在你的情况下,你可以写:

attribute :after,  kind_of: Hash, required: false, 
  :default => {:search_interface => nil, :search_control => nil, :search_plugin => nil},
  :callbacks => {
    "Must contain search interface" => proc { |v| 
      v.has_key?(:search_interface)
    }
  }
}