遍历 Chef 数组并在 Ohai 查找中使用键

Iterating over a Chef array and using key in Ohai lookup

我正在遍历数组,并希望将键用作查找 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"] 符号,以及转义引号。

要遍历 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"
}

而不只是 "root"。

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