puppet模块使用基于NFS的主目录获得“权限被拒绝”

时间:2014-03-20 00:57:31

标签: linux puppet

一些披露: 我使用的是主设备/代理设置,我拥有代理但没有主控制台的权限。 puppetmaster是git支持的,我控制有问题的模块的源。

我的问题有2个相关模块。其中一个似乎工作得很好,确保安装autofs并为auto.master提供2个文件资源,并为自定义auto.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密钥。这个模块&#34;工作&#34;在系统上我注释掉了Class依赖关系并且我没有挂载/ home到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挂载的根目录并创建这些用户&#39; s他们的uid / gid拥有的文件夹让autofs在登录时实际工作。
  • 当模块未能&#34;工作&#34;对于NFS挂载的主目录,错误是“权限被拒绝”#39;当它试图创建主文件夹时。我已经尝试过no_root_squash来对抗错误,但无济于事。我尝试以root身份运行代理,通过sudo运行not-root,根本不运行root等。
  

错误:   /舞台[主] / Ssh_keys / Local_user [用户A] /文件[/家庭/用户A] /保证:       从缺席状态更改为目录失败:无法设置&#39;目录&#39;确保:       权限被拒绝 - / home / userA at       80:/app/puppet/conf/environments/puppet_dev/modules/ssh_keys/manifests/init.pp

  • 放置ensure =&gt;似乎无害目前关于这些目录和文件资源的陈述。它们在技术上已经在NFS共享上创建了,但autofs似乎工作的方式是它实际上并没有“安装”#34;该用户共享,直到他们登录为止。这不是我的专业知识,而是我所经历的。当此模块成功运行时,它创建的每个用户的主目录在 df 输出中显示为装载。

  • 我怀疑机器本身有什么能防止这个模块以它应该的方式工作。我知道在这个模块运行干净的机器和不运行的机器之间可能有500种不同的东西,我应该调查哪些地方?

非常感谢任何协助。

2 个答案:

答案 0 :(得分:0)

auto.home的工作方式是在用户登录时挂载目录。如果用户没有登录,则不存在挂载 - 因此目录/文件资源失败。

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

如果您无法在NFS服务器上运行puppet,请选择1个服务器将其作为常规安装进行安装 - 即安装home dirs部分的根目录以使它们全部可见。还设置了no_root_squash。然后你应该能够让puppet创建目录。

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

答案 1 :(得分:0)

听起来像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',
}