我如何有条件地运行一大块资源或厨师食谱?

时间:2016-09-26 21:16:44

标签: ruby chef

我使用以下配方来创建一些用户,将它们添加到一个组并将密码设置为在首次登录时到期。

search(:users, '*:*').each do |user|
  userPassword = "$1$scmdevop$ZDTyqia9RXSrpHGK75FjN/"
  user user['id'] do
    comment user['comment']
    home user['home']
    shell user['shell']
    manage_home true
    password "#{userPassword}"
  end

  if user['sudo'] then
    group "#{node.default["sudogroup"]}" do
      action :modify
      members user['id']
      append true
    end
  end
  if (user['resetPassword'] == nil) || (user['resetPassword']) then
    bash 'setExporation' do
      code 'chage -d 0 ' + user['id']
      user 'root'
    end
  end
end

问题在于,通过这种方式,它将继续重置密码并在每次运行时设置呼吸,因此我试图找到如何有条件地进行调整。我想使用以下命令检查用户是否存在

grep -qs #{user["id"]} /etc/passwd

问题是我只能在第一个资源中使用not_if子句,因为之后用户已经清楚地创建了。有没有办法让三个资源的整个块都以shell退出代码为条件?

谢谢, 米歇尔。

1 个答案:

答案 0 :(得分:0)

您可能需要的是来自用户资源的通知,但这可能有点难,因为这会触发任何更改,而不仅仅是创建。这里的根本问题是,您所陈述的期望行为以程序性术语表达,而不是以融合状态表示。最好的方法可能是构建一个自定义资源来隐藏其中的一些逻辑,但是你想要的就是你想要的if语句。