2016-09-26 49 views
0

我有下面的配方用于创建一些用户,将它们添加到组并将密码设置为在第一次登录时过期。如何有条件地在厨师中运行一块资源或配方?

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 

的问题是,这样它会继续重置密码,并在每次运行设置espiration所以我试图找到如何使它有条件。我想,如果用户存在

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

的问题是,我可以使用not_if子句只在第一个资源,因为在此之后,用户已经明确创建使用下面的命令检查。有没有办法让整个三个资源块有条件的退出shell代码?

谢谢, 米歇尔。

回答

0

您可能想要的是来自用户资源的通知,但这可能有点困难,因为这会触发任何更改,而不仅仅是创建。这里存在的根本问题是,你所说的期望行为是用程序术语表示的,而不是以收敛状态表示。最好的办法可能是建立一个自定义资源来隐藏这些逻辑,但是你想要的就是你已经拥有的if声明。

+0

如果存在if_not子句,通知是否也会触发? – Mikyjpeg

+0

我可以使用if子句,问题是我需要从bash命令中设置一些东西(属性,属性或环境变量)才能在调用以下资源之前进行检查。其实唯一的问题是第三个资源,到期日期,至于用户我可以使用警卫队和组更改是可以重置为初始情况。也许我应该为该特定行为编写自定义资源? – Mikyjpeg

+0

我认为您将使用Ruby语法的if语句混淆了chef资源的'not_if' /'only_if'保护块/字符串功能。 – coderanger

相关问题