有没有一种方法可以遍历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
任何想法如何使这项工作?
在要使用它的node.run_state周围添加惰性{}块。因此在您的目录和模板资源中。 lazy {}确保资源在Chef Infra Client运行的执行阶段(而不是在编译阶段)进行评估。您可以阅读有关延迟块here]的更多信息>
在执行阶段中设置node.run_state
时,还需要在执行阶段中读取它。当前您的node.run_state.each
被跳过了,因为,正如您正确指出的,node.run_state
为空。
我的潜意识今天早晨告诉我,将路径拉到目录资源中,然后对它使用惰性。所以我有可行的解决方案。 ruby_block中的node.run_state,以及在后续使用node.run_state的资源中的必需属性周围的惰性块。感谢您对此问题的反馈。