Я новичок в 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 => {}}