从哈希数组生成 Puppet 资源

drd*_*man 3 configuration configuration-management puppet

我是 Puppet 的新手并开始使用它,我想学习如何管理系统用户。

我有几个用户,他们共享共同的属性,所以我想我应该把事情弄清楚。

经过一番挣扎,这就是我带来的:

define staff::ssh_key($user) {
    ssh_authorized_key { $name[name]:
        ensure  => present,
        key     => $name[key],
        type    => "ssh-rsa",
        user    => $user,
        require => File["/home/${user}/.ssh"],
    }
}

define staff($fullname, $ssh_keys, $shell = "/bin/bash") {
    user { $name:
        ensure     => present,
        comment    => "${fullname},,,",
        home       => "/home/${name}",
        managehome => true,
        groups     => ["users", "adm", "sudo"],
        shell      => $shell,
    }

    file { "/home/${name}/.ssh":
        ensure  => directory,
        mode    => 0700,
        owner   => $name,
        require => User[$name],
    }

    staff::ssh_key { $ssh_keys:
        user => $name,
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我声明这样的用户:

staff { "drdaeman":
    fullname => "Aleksey Zhukov",
    shell    => "/bin/zsh",
    ssh_keys => [
        {
            name => "desktop",
            key  => "AAAA....6s=",
        }
        {
            name => "notebook",
            key  => "AAAA....Q==",
        }
    ],
}
Run Code Online (Sandbox Code Playgroud)

暂时,我只是将这两个部分保存到一个名为staff.pp. 对于远程配置,我site.pp提供了以下内容:

node "foobar.example.org" {
    import "staff.pp"
}
Run Code Online (Sandbox Code Playgroud)

虽然在本地一切似乎都正常,但通过调用puppet apply staff.pp,它在远程使用时会失败。运行puppet agent --test产生了一个错误:

err: Could not retrieve catalog from remote server: Could not intern from pson: Could not convert from pson: Could not find relationship source "Staff::Ssh_key[namenotebookkeyAAAA...Q==]"
err: Could not retrieve catalog; skipping run
Run Code Online (Sandbox Code Playgroud)

(如果这很重要,我在 Ubuntu 上使用 Puppet 2.7.14,来自 apt.puppetlabs.com。)

因此,Puppet 似乎不喜欢将哈希作为资源名称,至少在数据通过网络传递时不喜欢。有什么办法可以解决这个问题,而不是ssh_authorized_key手动复制粘贴所有必需的资源?(这对我的口味来说太冗长了)

请注意,在这种确切的情况下,我可以通过使用 simplefile "/home/${name}/.ssh/authorized_keys": ... }而不是ssh_authorized_keyusing 来解决concat::fragment,但是这不适用于其他类似情况,其中某些资源具有多个依赖资源,而这些资源不容易减少到单个文件中。相反,我正在寻找一些相对通用的方法来解决这种情况和类似情况(如果有的话)。

Nan*_*Liu 5

您将需要使用 create_resource 而不是声明:

staff::ssh_key { $ssh_keys:
    user => $name,
}
Run Code Online (Sandbox Code Playgroud)

为了保留 user => $name 的便利性:

Staff::Ssh_key {
     user => $name,    
}

create_resources('staff::ssh_key', $ssh_keys)
Run Code Online (Sandbox Code Playgroud)

还将 ssh_keys 更改为散列而不是人员中的数组 { ... ssh_keys => { } }