使用虚拟资源管理用户

用户管理是使虚拟资源能派上用场的另一个很好的例子。考虑下面的设置。 你有三个用户:John、Graham 和 Steven。为了简化管理大量主机,你为两种类型的用户定义了类: developers 和 sysadmins。每个机器都需要包含 sysadmins,但只有一部分机器允许 developer 访问:

node server
{
    include user::sysadmins
}

node webserver inherits server
{
    include user::developers
}

John 是个系统管理员,Steven 是个开发者,而 Graham 既是系统管理员又是开发者, 所以 Graham 必须是两个组中的成员。这将在 webserver 上产生冲突,因为最终会导致重复定义用户 Graham。

为了避免这种情况,常见的做法是将所有用户设置成虚拟资源,并定义在一个单独的类 user::virtual 中,每个机器都包含这个类,然后在需要时对虚拟用户执行 realize。

操作步骤

  1. 创建如下的用户模块:

    # mkdir -p /etc/puppet/modules/user/manifests
    
  2. 使用如下内容创建 /etc/puppet/modules/user/manifests/virtual.pp 文件:

    class user::virtual
    {
        @user { "john": }
        @user { "graham": }
        @user { "steven": }
    }
    
  3. 使用如下内容创建 /etc/puppet/modules/user/manifests/developers.pp 文件:

    class user::developers
    {
        realize( User["graham"],
                 User["steven"] )
    }
    
  4. 使用如下内容创建 /etc/puppet/modules/user/manifests/sysadmins.pp 文件:

    class user::sysadmins
    {
        realize( User["john"],
                 User["graham"] )
    }
    
  5. 在一个节点中添加如下代码:

    include user::virtual
    include user::sysadmins
    include user::developers
    
  6. 运行 Puppet:

    # puppet agent --test
    info: Retrieving plugin
    info: Caching catalog for cookbook.bitfieldconsulting.com
    info: Applying configuration version '1305554239'
    notice: /Stage[main]/User::Virtual/User[john]/ensure: created
    notice: /Stage[main]/User::Virtual/User[steven]/ensure: created
    notice: /Stage[main]/User::Virtual/User[graham]/ensure: created
    notice: Finished catalog run in 2.36 seconds
    

工作原理

每个节点都应该包含 user::virtual 类,作为基本配置的一部分,所有服务器都继承这个类。 这个类将为你的组织或站点定义所有的用户。同时也应包括只是为了运行应用程序或服务的任何用户 (即非登录用户,例如 apache 或 git)。

然后你可以对你的用户进行分组(不同于 UNIX 系统中的组,只是用于区分不同的团队或任务角色), 例如 developers 和 sysadmins。 对于一个组的类,可以 realize 组里需要的所有用户,例如:

class user::sysadmins
{
    realize( User["john"],
             User["graham"] )
}

之后便可以在任何需要的地方包含这些组,而不用担心因为多次定义同一个用户而产生的冲突。

参见本书