Я хочу управлять смонтированными разделами из марионетки, что включает в себя изменение /etc/fstab
и создание каталогов, используемых в качестве точек монтирования. В mount
обновления типов ресурсов fstab
просто отлично, но используя file
для создания точек монтирования немного сложно.
Например, по умолчанию владельцем каталога является корень и если у корня (/) смонтированного раздела есть другой владелец, puppet попытается изменить его, а я этого не хочу. Я знаю, что могу установить владельца этого каталога, но почему меня должно волновать, что находится на смонтированном разделе? Все, что я хочу сделать, это смонтировать его. Есть ли способ заставить марионетку не заботиться о разрешениях каталога, используемого в качестве точки монтирования?
Вот что я использую сейчас:
define extra_mount_point(
$device,
$location = "/mnt",
$fstype = "xfs",
$owner = "root",
$group = "root",
$mode = 0755,
$seltype = "public_content_t"
$options = "ro,relatime,nosuid,nodev,noexec",
) {
file { "${location}/${name}":
ensure => directory,
owner => "${owner}",
group => "${group}",
mode => $mode,
seltype => "${seltype}",
}
mount { "${location}/${name}":
atboot => true,
ensure => mounted,
device => "${device}",
fstype => "${fstype}",
options => "${options}",
dump => 0,
pass => 2,
require => File["${location}/${name}"],
}
}
extra_mount_point { "sda3":
device => "/dev/sda3",
fstype => "xfs",
owner => "ciupicri",
group => "ciupicri",
$options => "relatime,nosuid,nodev,noexec",
}
Если это важно, я использую puppet-0.25.4-1.fc13.noarch.rpm и puppet-server-0.25.4-1.fc13.noarch.rpm.
P.S. undef
отлично работает для владельца, группы и разрешений, но не для SELinux. Если разделы уже смонтированы, марионетка жалуется:
puppetd[18052]: Failed to set SELinux context system_u:object_r:public_content_t:s0 on /mnt/sda3
puppetd[18052]: (/File[/mnt/sda3]/seluser) seluser changed 'unconfined_u' to 'system_u'
puppetd[18052]: Failed to set SELinux context unconfined_u:object_r:mnt_t:s0 on /mnt/sda3
puppetd[18052]: (/File[/mnt/sda3]/seltype) seltype changed 'public_content_t' to 'mnt_t'
Разрешения смонтированного раздела:
drwxr-xr-x. root root unconfined_u:object_r:public_content_t:s0 /mnt/sda3/
а разрешения точки монтирования, созданной марионеткой:
drwxr-xr-x. root root system_u:object_r:mnt_t:s0 /mnt/sda3/
P.P.S. Я сообщил о ошибка за это странное поведение.
Вы можете указать Puppet не управлять данным метапараметром, установив для него значение undef
.
file { "${location}/${name}":
ensure => directory,
owner => undef,
group => undef,
mode => undef,
selinux_ignore_defaults => true,
}
В этом случае, если каталог не существует перед подключением, он будет создан как пользователь и группа, которая puppetd
был запущен как (предположительно root: wheel) и с маской по умолчанию. Puppet не заботится о том, что они установлены во время создания или при любых последующих запусках.
В качестве альтернативы, если вы хотите обменять небольшую сложность на уверенность, вы можете использовать настраиваемый факт для определения активных монтирований и оператор switch для установки прав доступа к каталогу в зависимости от того, монтируются ли они до или после.
Не совсем ответ, но это было исправлено в марионетке 2.6.7: http://projects.puppetlabs.com/issues/3999
У меня есть специальный факт (работает только с ATM Linux), который вернет все текущие локальные монтирования в системе. Это ужасно просто, но для меня работает - похоже, вы тоже можете найти ему применение. В общем, на гитхаб закинул: https://github.com/justintime/puppet/tree/master/justintime-localmounts