是否有一种方法可以在Chef食谱中遍历node.run_state数据?

问题描述 投票:2回答:3

有没有一种方法可以遍历node.run_state数据?这是在具有Active Directory用户的RHEL环境中。我有一个填充node.run_state的红宝石块。我必须在聚合时运行此命令,因为整个食谱将用于构建自动化。首次运行时,该食谱会安装Centrify,然后需要运行adquery来收集用户信息,以使用SSH密钥填充主目录。

在厨师客户运行中,我看到了:

       Compiling Cookbooks...
       {}

显然,这是put在编译时针对空哈希运行的结果。在聚合时,使用2个目录和1个模板资源的循环不会发生任何事情。

这是食谱的相关部分:

ruby_block 'set uid, gid, and homedir for users' do
  block do
    base_attr['ssh_keys'].each do |user, pubkeys|
  # next unless Dir.exist?(homedir)
      node.run_state[user] = {}
      puts "Checking user #{user}..."
      if local_users.key?(user)
        node.run_state[user]['homedir'] = local_users[user]['homedir']
        node.run_state[user]['uid'] = local_users[user]['uid'].to_i
        node.run_state[user]['gid'] = local_users[user]['gid'].to_i
      elsif centrify_users.key?(user)
        node.run_state[user]['homedir'] = centrify_users[user]['homedir']
        node.run_state[user]['uid'] = centrify_users[user]['uid'].to_i
        node.run_state[user]['gid'] = centrify_users[user]['gid'].to_i
      else
        puts "user #{user} not found."
        # Place holder values.
        node.run_state[user]['homedir'] = "/tmp/#{user}"
        node.run_state[user]['uid'] = 0
        node.run_state[user]['gid'] = 0
      end
    end
  end
end
  # Dir.exist? guard should bypass compile-time error.
  # "name is a required property"
  # next unless Dir.exist?(homedir)
puts node.run_state
node.run_state.each do |user|
  directory node.run_state[user]['homedir'] do
    owner node.run_state[user]['uid']
    group node.run_state[user]['gid']
    mode '0700'
  end

  directory "#{node.run_state[user]['homedir']}/.ssh" do
    owner node.run_state[user]['uid']
    group node.run_state[user]['gid']
    mode '0700'
  end

  template "#{node.run_state[user]['homedir']}/.ssh/authorized_keys" do
    owner node.run_state[user]['uid']
    group node.run_state[user]['gid']
    mode '0600'
    source 'authorized_keys.erb'
    variables(
      sshkeys: base_attr['ssh_keys'][user]
    )
  end
end

任何想法如何使这项工作?

chef rhel centrify
3个回答
1
投票

在要使用它的node.run_state周围添加惰性{}块。因此在您的目录和模板资源中。 lazy {}确保资源在Chef Infra Client运行的执行阶段(而不是在编译阶段)进行评估。您可以阅读有关延迟块here]的更多信息>


0
投票

在执行阶段中设置node.run_state时,还需要在执行阶段中读取它。当前您的node.run_state.each被跳过了,因为,正如您正确指出的,node.run_state为空。


0
投票

我的潜意识今天早晨告诉我,将路径拉到目录资源中,然后对它使用惰性。所以我有可行的解决方案。 ruby_block中的node.run_state,以及在后续使用node.run_state的资源中的必需属性周围的惰性块。感谢您对此问题的反馈。

© www.soinside.com 2019 - 2024. All rights reserved.