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

Применение разрешений к хешированному домашнему каталогу с помощью марионетки

Домашние каталоги в нашей среде хешируются с использованием первых двух букв имени пользователя. Например, домашний каталог для пользователя 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.