puppet 模块在应用基于 NFS 的主目录时获取'Permission denied'



一些披露:我正在使用主/代理设置,其中我拥有代理,但没有访问主控制台的权限。puppetmaster是由git支持的,并且我控制所讨论的模块的源代码。

我的问题有2个相关模块。其中一个似乎工作得很好,确保安装了autofs,并为auto提供了2个文件资源。大师和一辆定制汽车。Home挂载主目录

#auto.home
#this file is used by auto.master to automount home directories
#from the nfs cluster when a user logs in.
* -fstype=nfs,rw,nosuid,soft <IPaddress>:/homedirs/&

在添加主目录的模块中,我正在创建用户并通过文件资源部署他们的公共ssh密钥。当我注释掉Class依赖并且我没有将/home挂载到NFS时,这个模块在系统上"工作",并且当我在NFS上按原样部署它时,它有时会工作。

define local_user(
  $fullname,
  $username = $title,
  $userid,
  $gid = 9999,
  $homedir_mode = 0700
) {
  $white_gid = $gid
  user { $username:
    ensure  => present,
    comment => $fullname,
    gid     => $white_gid,
    uid     => $userid,
    home    => $homedir,
    require => Group[ "white" ],
  }
  exec { "chage -M 99999 ${username}":
    command     => "chage -M 99999 ${username}",
    path        => "/bin:/sbin:/usr/bin:/usr/sbin",
    # chage(1) only works on local users, not on LDAP users,
    # so make sure this is a local user before we try to
    # change their password expiration.
    onlyif      => "grep -q '^${username}:' /etc/passwd",
    subscribe   => User[ $username ],
    refreshonly => true,
  }
  file { $homedir:
     ensure   => directory,
     owner    => $username,
     group    => $white_gid,
     mode     => $homedir_mode,
     require  => User[ $username ],
   }
   file { "$homedir/.ssh":
     ensure  => directory,
     owner   => $username,
     group   => $white_gid,
     mode    => 0700,
     require => File[ "$homedir" ],
   }
   file { "$homedir/.ssh/authorized_keys":
     ensure  => present,
     owner   => $username,
     group   => $white_gid,
     mode    => 0600,
     source  => "puppet:///modules/ssh_keys/${username}_authorized_keys",
     require => File["$homedir/.ssh"],
  }
}
class ssh_keys {
  group { "white":
    ensure => present,
    gid    => 9999,
    require => Class["nfs_homedirs"],
  }
  #### add users below this line
  local_user { "userA"  : fullname => "userA",    userid => "123" }

有些事情我很困惑,需要专业知识来解决:

    为了使NFS主目录能够工作,我必须在一台机器上运行该模块以在本地创建用户,然后为主目录挂载NFS挂载的根目录,并创建由用户uid/gid所有的用户文件夹,以便在用户登录时自动文件能够实际工作。
  • 当模块无法对nfs挂载的主目录"工作"时,当它试图创建主文件夹时,错误是"Permission denied"。我尝试了no_root_squash来解决这个错误,但无济于事。我已经尝试过以root身份运行代理,通过sudo作为非root,作为非root,等等。

错误:/阶段[主要]/Ssh_keys Local_user [userA]/文件(/home/userA]/确保:从缺席更改到目录失败:无法在确保上设置'directory'权限被拒绝-/home/userA at80:/app/木偶/conf/环境/puppet_dev/模块/ssh_keys/表现/init.pp

  • 在这些目录和文件资源上放置ensure => present语句似乎是无害的。从技术上讲,它们已经在NFS共享上创建了,但是autofs的工作方式似乎是,在用户登录之前,它实际上不会"挂载"该用户的共享。这不是我的专长,但这是我的经验。当这个模块成功运行时,它创建的每个用户的主目录在df输出中显示为一个挂载。

  • 我怀疑机器本身有什么东西阻止了这个模块的工作方式。知道了这个模块能正常运行的机器和不能正常运行的机器之间可能有500个不同之处,我应该调查哪些地方?

方式自动。Home工作是在用户登录时挂载目录。如果用户没有登录,则不存在挂载——因此您的目录/文件资源失败。

我个人不会尝试在nfs挂载上创建主目录。另外,您不希望多个服务器尝试管理相同的物理资源。如果可能的话,将其拆分为仅在NFS服务器上运行,并运行与主目录相关的所有文件资源。让nfs客户端确保nfs已配置并且本地用户帐户存在。

如果您不能在NFS服务器上运行puppet,那么选择一台服务器作为常规挂载来挂载它——即挂载home dirs部分的根目录,这样它们都是可见的。也设置no_root_squash。然后,您应该能够让puppet创建目录。

ssh_authorized_key资源也很方便。我经常用。

听起来像是在强制执行selinux,即使您拥有正确的用户/uid拥有目录,也会导致permission denied。如果您强制使用selinux,那么您需要检查是否允许使用nfs_home_dirs。首先,执行以下命令检查:

getsebool use_nfs_home_dirs

如果它返回为use_nfs_home_dirs --> off,那么您可以使用setsebool -P use_nfs_home_dirs 1手动纠正此错误,或者您可以使用puppet来管理此问题:

include selinux
selinux::boolean {'use_nfs_home_dirs':
  ensure => 'on',
}

最新更新