Chef条件资源参数

我正在通过Chef创建一个用户。 他的属性存储在数据包中:

{ "id": "developer", "home": "/home/developer", "shell": "/bin/zsh", "password": "s3cr3t" } 

食谱是:

 developer = data_bag_item('users', 'developer') user developer['id'] do action :create supports :manage_home => true home developer['home'] comment developer['comment'] shell developer['shell'] password developer['password'] end 

问题是如果节点上没有安装zsh ,我就无法以developer身份登录。 所以,我想有条件地为user资源应用参数,例如:

 user developer['id'] do action :create supports :manage_home => true home developer['home'] comment developer['comment'] if installed?(developer['shell']) shell developer['shell'] end password developer['password'] end 

我怎样才能做到这一点?

为了补充@ mudasobwa的答案正确的方法在厨师做,并避免错过shell,如果它是由另一个食谱或包资源安装在同一食谱中,你必须使用惰性属性评估 。

对于如何以及为什么感兴趣的长版本:

这是关于厨师如何工作的副作用,第一次编译资源来构建集合,在此阶段,如果评估,配方中的任何ruby代码(在ruby_block资源之外)。 一旦完成,资源收集就会收敛(将所需状态与实际状态进行比较,并完成相关操作)。

以下配方可以:

 package "zsh" do action :install end user "myuser" do action :create shell lazy { File.exists? "/bin/zsh" ? "/bin/zsh" : "/bin/bash" } end 

这里最重要的是shell属性值的评估被延迟到收敛阶段,我们必须使用if-then-else结构(这里有一个三元运算符,因为我发现它更具可读性)以回退到shell我们’确定将存在(我使用/bin/bash ,但故障安全值将是/bin/sh )或shell属性将为nil,这是不允许的。

通过这种延迟评估,在安装软件包并且文件应该存在之后,对“/ bin / zsh”的存在进行测试。 如果包中存在问题,用户资源仍将创建用户,但使用“/ bin / bash”

实现您想要的最简单方法是显式检查shell存在:

 shell developer['shell'] if File.exist? developer['shell']