厨师条件资源的说法(Chef conditional resource argument)

2019-10-22 21:10发布

我创建通过厨师的用户。 他的属性存储在数据包:

{
    "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

我怎样才能做到这一点?

Answer 1:

为了补充@ mudasobwa的答案正确的方式做到这一点的厨师和避免丢失shell,如果它是由另一个配方或你必须使用相同的配方包资源安装lazy属性的评价 。

长版thoose兴趣在如何和为什么:

这是一个关于如何厨师的作品,如果有评估的第一次编译的资源建立一个集合,在这个阶段在配方中的任何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

什么hapens这里是Shell属性值的评估延迟到收敛阶段,我们必须使用IF-THEN-ELSE结构(这里的三元运营商,因为我觉得它更易读)退却到我们”壳重新确定将存在(I使用/bin/bash ,但故障安全值将是/bin/sh )或壳属性将是零,这是不允许的。

有了这个延迟评价“/斌/ zsh的”存在的测试已安装包后完成,文件应该存在。 在该案中,内包有问题,用户资源还是将创建用户,但与“/斌/庆典”



Answer 2:

达到你想要的最简单的方法是检查外壳是否存在明确的:

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


文章来源: Chef conditional resource argument