【问题标题】:How can I conditionally run a block of resources or a recipe in chef?如何有条件地在厨师中运行资源块或食谱?
【发布时间】:2016-09-27 05:56:11
【问题描述】:

我有以下方法用于创建一些用户,将它们添加到组中并将密码设置为在首次登录时过期。

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 退出代码为条件?

谢谢, 米歇尔。

【问题讨论】:

    标签: ruby chef-infra


    【解决方案1】:

    您可能想要的是来自用户资源的通知,但这可能有点困难,因为这会触发任何更改,而不仅仅是创建。这里的根本问题是您所说的所需行为是用程序术语表达的,而不是用收敛状态表达的。最好的方法可能是构建一个自定义资源来隐藏其中的一些逻辑,但本质上你想要的是一个 if 声明,就像你已经拥有的那样。

    【讨论】:

    • 如果有 if_not 子句,通知也会触发吗?
    • 我可以使用 if 子句,问题是我需要从 bash 命令设置一些东西(属性、属性或环境变量),以便在调用以下资源之前进行检查。实际上唯一的问题是第三个资源,到期日期,至于用户我可以使用保护并且组更改可以重置为初始情况。也许我应该为该特定行为编写自定义资源?
    • 我认为您将 Chef 资源的 not_if/only_if 保护块/字符串功能与 Ruby 语法的 if 语句混淆了。
    • 好吧,据我了解,我可以使用 not_if/only_if 来避免执行资源(我已经在其他配方中使用它)。不对吗?
    • 它专门阻止聚合动作,但仅限于单个资源。要同时阻止多个资源,您只需阻止它们使用条件编译即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多