当在不同的系统上有所不同时,如何配置 puppet 以将用户添加到 sudoers 组(或者,变量如何工作?)

当在不同的系统上有所不同时,如何配置 puppet 以将用户添加到 sudoers 组(或者,变量如何工作?)

我开始使用 Puppet 配置系统,但在设置用户帐户时遇到了麻烦。

在我们的 CentOS 5.3 服务器上,sudoers 组是“wheel”,gid 为 10。在我们的 Ubuntu 9.10 服务器上,该组是“sudo”,gid 为 27。如何设置组帐户以便两个框都获得正确的组并且我的用户被添加到正确的组?

我尝试将此配置分成 os_vars.pp、virt_groups.pp 和 virt_users.pp。

操作系统变量.pp:

class os_vars {
  case $operatingsystem {
    centos: {
      $os_admin_group = "wheel"
      $os_admin_group_gid = "10"
    }
    ubuntu: {
      $os_admin_group = "sudo"
      $os_admin_group_gid = "27"
    }
  }
  notice("in os_vars, admin group is: ${os_admin_group}, ${os_admin_group_gid}")
}

virt_groups.pp:

class virt_groups {
  include os_vars
  notice("in virt_groups, admin group is: ${os_admin_group}, ${os_admin_group_gid}")
  @group { $os_admin_group:
    gid => $os_admin_group_gid,
    ensure => present,
  }
}

virt_用户.pp:

class virt_users {
  include os_vars
  notice("in virt_users, admin group is: ${os_admin_group}, ${os_admin_group_gid}")
  @user { 'my_user':
    home => '/home/my_user',
    uid => '500',
    groups => [$os_admin_group],
    password => $1BigLongEncrypedStuff
    gid => '500',
    ensure => 'present',
    shell => '/bin/bash'
  }
}

在 os_vars.pp 中,变量设置正确,但在 virt_users.pp 和 virt_groups.pp 中它们为空。

答案1

变量需要限定范围并加引号。virt_groups.pp 的正确语法是:

class virt_groups {
  include os_vars
  notice("in virt_groups, admin group is: ${os_vars::os_admin_group}, ${os_vars::os_admin_group_gid}")
  @group { "${os_vars::os_admin_group}:
    gid => "${os_vars::os_admin_group_gid}",
    ensure => present,
  }
}

这解决了我眼前的问题,但仍然似乎是一种笨拙的方式来处理可能常见的木偶问题。

答案2

与上一个答案一样,变量必须具有范围。不要为组 ID 或虚拟sudo/wheel组而烦恼。如果管理员组已存在于系统中,则无需定义它。

使用 ? 选择器代替可以case使代码更简洁一些:

class os_vars {
  $admin_group = $::operatingsystem ? {
     'centos' => 'wheel',
     default  => 'sudo',
  }
  notice("in os_vars, admin group is: ${admin_group}")
}

class virt_users {
  include os_vars
  notice("in virt_groups, admin group is: ${os_vars::admin_group}")
  @user { 'my_user':
    ....
    groups => [$os_vars::admin_group],
  }
}

如果该组不存在而您必须使用 Puppet 创建它,则最好省略 GID 以避免冲突。system参数为该组提供来自系统区域的 ID:

include os_vars
group {$os_vars::admin_group:
  ensure => present,
  system => true,
}

相关内容