首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种方法来迭代厨师食谱中的node.run_state数据?

有没有一种方法来迭代厨师食谱中的node.run_state数据?
EN

Stack Overflow用户
提问于 2020-05-28 17:04:07
回答 3查看 660关注 0票数 2

有什么方法可以迭代node.run_state数据吗?这是在具有Active Directory用户的RHEL环境中。我有一个红宝石块填充node.run_state。我必须在聚合时间运行这个程序,因为整个食谱将用于构建自动化。在第一次运行时,cookbook安装Centrify,然后需要运行adquery来收集用户信息,以便用SSH键填充主目录。

在主厨和客户的跑步中,我看到了这个:

代码语言:javascript
复制
       Compiling Cookbooks...
       {}

显然,这是在编译时针对空哈希运行的puts。在会聚时,循环中没有发生任何情况,只有2个目录和1个模板资源。

下面是食谱的相关部分:

代码语言:javascript
复制
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

有什么办法让这件事成功吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-29 13:46:38

今天早上,我的潜意识告诉我要在目录资源中拉出路径,然后在上面使用懒惰。所以我有了解决办法。node.run_state在ruby_block中,而懒散块围绕在使用node.run_state的后续资源中的必需属性。感谢大家对这个问题的反馈。

票数 0
EN

Stack Overflow用户

发布于 2020-05-28 17:34:37

在使用node.run_state的地方添加惰性{}块。因此,在您的目录和模板资源。懒散{}确保在Chef客户端运行的执行阶段(而不是在编译阶段)对备用资源进行评估。您可以阅读更多关于延迟块这里的内容。

票数 1
EN

Stack Overflow用户

发布于 2020-05-29 11:24:00

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

因此,您需要将这个node.run_state.each执行移到执行阶段。一种可能是创建一个ruby_block并将您的循环移到那里,不幸的是,您不能像菜谱中那样使用资源方法,但是您可以直接使用资源类:

代码语言:javascript
复制
ruby_block 'Create ssh authorized keys' do
  block do
    node.run_state.each do |user|
      d = Chef::Resource::Directory.new(node.run_state[user]['homedir'], run_context)
      d.owner node.run_state[user]['uid']
      d.group node.run_state[user]['gid']
      d.mode '0700'
      d.run_action :create

      d = Chef::Resource::Directory.new("#{node.run_state[user]['homedir']}/.ssh", run_context)
      d.owner node.run_state[user]['uid']
      d.group node.run_state[user]['gid']
      d.mode '0700'
      d.run_action :create

      t = Chef::Resource::Template.new("#{node.run_state[user]['homedir']}/.ssh/authorized_keys", run_context)
      t.owner node.run_state[user]['uid']
      t.group node.run_state[user]['gid']
      t.mode '0600'
      t.source 'authorized_keys.erb'
      t.variables(sshkeys: base_attr['ssh_keys'][user])
      t.run_action :create
    end
  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62070443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档