Похоже, вы столкнулись с одним из ограничений марионетки. Я бы просто написал сценарий оболочки, который бы это сделал.
Другим возможным решением могло бы быть написание плагина для марионетки, который позволил бы вам использовать новый тип данных (скажем, file_wildcard) или что-то в этом роде. Это должно быть возможно написать на Ruby, но я этого никогда не делал.
Марионетка не распознает подстановочные знаки в типах файлов. Если вы используете что-то вроде этого:
file { "/home/*":
ensure => directory,
owner => $username,
group => $username,
mode => 700,
require => [ User[$username], Group[$username] ]
}
, будет создана папка / home / \ *
.
Итак, вы должны создать структуру каталогов, которая вам нужна, как показано ниже:
define add_user ( $fullname, $uid ) {
$username = $title
$firstletter = regsubst($username, '(.).*', '\1')
$secondletter = regsubst($username, '.(.).*', '\1')
user { $username:
comment => "$fullname",
home => "/home/$firstletter/$secondletter/$username",
shell => "/bin/bash",
uid => $uid,
require => [ File["/home/$firstletter"], File["/home/$firstletter/$secondletter"] ]
}
group { $username:
gid => $uid,
require => User[$username]
}
file { "/home/$firstletter":
ensure => directory,
owner => root,
group => root,
mode => 755
}
file { "/home/$firstletter/$secondletter":
ensure => directory,
owner => root,
group => root,
mode => 755,
require => File["/home/$firstletter"]
}
file { "/home/$firstletter/$secondletter/$username":
ensure => directory,
owner => $username,
group => $username,
mode => 700,
require => [ File["/home/$firstletter/$secondletter"], User[$username], Group[$username] ]
}
file { "/home/$firstletter/$secondletter/$username/.ssh":
ensure => directory,
owner => $username,
group => $username,
mode => 700,
require => File["/home/$firstletter/$secondletter/$username"]
}
# now make sure that the ssh key authorized files is around
file { "/home/$firstletter/$secondletter/$username/.ssh/authorized_keys":
ensure => present,
owner => $username,
group => $username,
mode => 600,
require => File["/home/$firstletter/$secondletter/$username"]
}
}
, и вызвать ее с помощью :
node 'test_node' {
add_user { lars:
fullname => "Larry Page",
uid => 510
}
}