Назад | Перейти на главную страницу

Создание ресурсов 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. Для удаленной настройки я поставил 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

(Я использую Puppet 2.7.14 в Ubuntu с сайта apt.puppetlabs.com, если это имеет значение.)

Итак, похоже, Puppet не любит хеши в качестве имен ресурсов, по крайней мере, когда данные передаются по сети. Могу ли я как-нибудь обойти это, не прибегая к копированию всех необходимых ssh_authorized_key ресурсы вручную? (На мой вкус это было бы слишком многословно)

Обратите внимание: в этом конкретном случае я могу обойтись, используя простой file "/home/${name}/.ssh/authorized_keys": ... } вместо того ssh_authorized_key, или с помощью concat::fragment, однако это не сработает с другими аналогичными случаями, когда у некоторого ресурса есть несколько зависимых ресурсов, которые нелегко свести в один файл. Скорее ищу относительно общий способ, возможно, решить эту проблему и подобные ситуации (если есть).

Вам нужно будет использовать create_resource вместо объявления:

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

Чтобы сохранить удобство user => $ name:

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

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

Также измените ssh_keys на хэш вместо массива в Staff {... ssh_keys => {}}