Домашние каталоги в нашей среде хешируются с использованием первых двух букв имени пользователя. Например, домашний каталог для пользователя lars
является /home/l/a/lars
.
Я хотел бы использовать марионетку для обеспечения разрешений режима 0700 для домашних каталогов пользователей, но я не уверен, как настроить таргетинг на домашние каталоги. По сути, я хотел бы сделать это:
chmod 700 /home/*/*/*
В отсутствие хеширования это было бы легко (например, используя recurse
и recurselimit
), но хеширование заставило меня искать решение.
ОБНОВИТЬ: Я не собираюсь перечислять наших пользователей в марионетке (потому что домашние каталоги создаются как часть нашего процесса управления учетной записью).
Размышляя об этом, я тоже запутался. Даже если бы наши домашние каталоги не были хешированы, как бы я мог заставить марионетку применять разрешения к содержание каталога, не затрагивая сам верхний каталог? Я думал примерно так:
file { '/home:
ensure => directory,
mode => 0700,
recurse => true,
recurselimit => 1,
}
Но это применит режим к обоим /home
и его непосредственное содержание. Режим 700 включен /home/lars
Это хорошо. Режим 700 включен /home
это большая проблема. Это вообще возможно?
Похоже, вы столкнулись с одним из ограничений марионетки. Я бы просто написал сценарий оболочки, который бы это сделал.
Другое возможное решение - написать плагин для марионетки, который позволит вам использовать новый тип данных (скажем, file_wildcard) или что-то в этом роде. Должно быть возможно написать его на Ruby, но я этого никогда не делал.
Puppet не понимает подстановочные знаки в типах файлов. Если вы используете что-то вроде этого:
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
}
}
Вам нужно либо объявить ресурсы File, которыми вы хотите управлять Puppet (Puppet - это декларативный язык ...) для марионетки, либо вы смотрите на использование exec введите для выполнения предоставленного вами фрагмента кода chmod.