【问题标题】:Iterating over a Chef array and using key in Ohai lookup遍历 Chef 数组并在 Ohai 查找中使用键
【发布时间】:2015-06-30 16:36:56
【问题描述】:

我正在遍历一个数组,并希望使用该键作为逻辑的一部分来查找 Ohai 值。在我的特殊情况下,如果从以前的资源触发,我会尝试 source 每个定义的用户的 .bashrc。

Ohai 结构:

"etc": { "passwd": { "root": { "dir": "/root", "gid": 0, "uid": 0, "shell": "/bin/bash", "gecos": "root" }, ... "foo": { "dir": "/home/foo", "gid": 501, "uid": 501, "shell": "/bin/bash", "gecos": "" }, ...

所以当我遍历时,我正在尝试做类似的事情:

node['my_cookbook']['managed_users'].each do |usr| bash 'reload_shell' do code "source #{node['etc']['passwd'][usr]['dir']}/.bashrc" action :nothing end end

我也尝试过使用['usr'][#{usr}]["usr"] 符号,以及转义引号。

【问题讨论】:

    标签: loops attributes chef-infra ohai-gem


    【解决方案1】:

    要遍历 ruby​​ 中的哈希并访问您可以执行的密钥:

    node['my_cookbook']['managed_users'].each do |usr,props|
      bash 'reload_shell' do
        code "source #{node['etc']['passwd'][usr]['dir']}/.bashrc"
        action :nothing
      end
    end
    

    如果您不关心键或其下的值,请将相应的变量替换为_,即在您的情况下:

    node['my_cookbook']['managed_users'].each do |usr,_|
      bash 'reload_shell' do
        code "source #{node['etc']['passwd'][usr]['dir']}/.bashrc"
        action :nothing
      end
    end
    

    如果不这样做,您将获得完整的底层哈希,因此您的 usr var 是

    {
      "root": {
        "dir": "/root",
        "gid": 0,
        "uid": 0,
        "shell": "/bin/bash",
        "gecos": "root"
    }
    

    而不仅仅是“根”。

    旁注:源代码适用于当前 shell,在 bash 资源中生成 shell,执行命令并关闭 shell。获取文件不会有任何影响(除非 .bash_rc 中有一个复杂的进程在做某事,这不会影响系统和主厨运行)

    【讨论】:

    • 我为您对采购的解释表示支持,谢谢!但是,我仍然看到undefined method [] for nil:NilClass 使用 |usr,_| 的问题。符号。
    • 这不是您原始问题的一部分,这意味着属性名称中缺少某些内容或拼写错误,或者您的目标用户不存在
    • 只是为了结束我未定义方法问题的循环,我需要包含一个 ohai “重新加载”资源并使用惰性属性设置我的路径。 docs.chef.io/resource_ohai.htmldocs.chef.io/resource_common.html#lazy-attribute-evaluation
    • 如果用户是在同一个地方创建的,确实需要重新加载 ohai 才能让预期的用户出现在节点属性中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 2013-09-10
    • 2015-01-25
    相关资源
    最近更新 更多