如何从 puppet 管理已挂载的分区(fstab + 挂载点)

如何从 puppet 管理已挂载的分区(fstab + 挂载点)

我想从 puppet 管理已挂载的分区,包括修改/etc/fstab和创建用作挂载点的目录。mount资源类型更新fstab正常,但用于file创建挂载点有点棘手。

例如,默认情况下目录的所有者是如果挂载分区的根目录 (/) 有其他所有者,puppet 将尝试更改它,而我不想这样。我知道我可以设置该目录的所有者,但我为什么要关心挂载分区上的内容?我只想挂载它。有没有办法让 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。


PSundef适用于所有者、组和权限,但不适合 SELinux。如果分区已安装,puppet 会抱怨:

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/

而puppet创建的挂载点的权限为:

 drwxr-xr-x. root root system_u:object_r:mnt_t:s0       /mnt/sda3/

PPS 我已经报告了漏洞对于这种奇怪的行为。

答案1

您可以通过将给定的元参数设置为 来告诉 Puppet 不要管理它undef

file { "${location}/${name}":
    ensure                  => directory,
    owner                   => undef,
    group                   => undef,
    mode                    => undef,
    selinux_ignore_defaults => true,
}

在这种情况下,如果目录在挂载之前不存在,它将被创建为以puppetd(可能是 root:wheel) 启动的用户和组,并使用默认的 umask。Puppet 不会关心在创建时或任何后续运行中这些设置为何。


或者,如果您想用一点复杂性来换取保证,那么您可以使用自定义事实来确定活动挂载是什么,并使用 switch 语句来根据它是预挂载还是后挂载来设置目录权限。

答案2

这并不是真正的答案,但是这个问题已在 puppet 2.6.7 中修复:http://projects.puppetlabs.com/issues/3999

答案3

我有一个自定义事实(目前仅适用于 Linux ATM),它将返回系统上当前安装的所有本地挂载。它非常简单,但对我来说很管用——看起来你也可能会发现它的一些用处。无论如何,我把它放在了 github 上:https://github.com/justintime/puppet/tree/master/justintime-localmounts

相关内容