web-dev-qa-db-ja.com

ハッシュの配列からPuppetリソースを生成する

私は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,
    }
}

次に、次のようなユーザーを宣言します。

staff { "drdaeman":
    fullname => "Aleksey Zhukov",
    Shell    => "/bin/zsh",
    ssh_keys => [
        {
            name => "desktop",
            key  => "AAAA....6s=",
        }
        {
            name => "notebook",
            key  => "AAAA....Q==",
        }
    ],
}

とりあえず、これらの部分は両方ともstaff.ppという1つのファイルに保存されています。リモート構成の場合、次の内容でsite.ppを配置しました。

node "foobar.example.org" {
    import "staff.pp"
}

ローカルではすべて正常に動作しているように見えますが、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

(これが重要な場合は、apt.puppetlabs.comのUbuntuでPuppet 2.7.14を使用しています。)

したがって、Puppetは、少なくともデータがネットワークを介して渡されるときは、リソース名としてハッシュを好まないようです。必要なすべてのssh_authorized_keyリソースを手動でコピーして貼り付けるのではなく、これを回避する方法はありますか? (それは私の好みには冗長すぎるでしょう)

この正確なケースでは、file "/home/${name}/.ssh/authorized_keys": ... }の代わりに単純なssh_authorized_keyを使用するか、 concat::fragmentを使用 を使用して回避できますが、他の同様のファイルでは機能しないことに注意してください。一部のリソースに複数の依存リソースがあり、それらを1つのファイルに簡単に縮小できない場合。むしろ、私はこのおよび同様の状況(もしあれば)を解決するための比較的一般的な方法を探しています。

3
drdaeman

次のように宣言する代わりに、create_resourceを使用する必要があります。

staff::ssh_key { $ssh_keys:
    user => $name,
}

ユーザーの利便性を維持するには=> $ name:

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

create_resources('staff::ssh_key', $ssh_keys)

また、ssh_keysをstaffの配列ではなくハッシュに変更します{... ssh_keys => {}}

5
Nan Liu