使用虚拟资源管理用户
用户管理是使虚拟资源能派上用场的另一个很好的例子。考虑下面的设置。 你有三个用户: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。
操作步骤
创建如下的用户模块:
# mkdir -p /etc/puppet/modules/user/manifests
使用如下内容创建 /etc/puppet/modules/user/manifests/virtual.pp 文件:
class user::virtual { @user { "john": } @user { "graham": } @user { "steven": } }
使用如下内容创建 /etc/puppet/modules/user/manifests/developers.pp 文件:
class user::developers { realize( User["graham"], User["steven"] ) }
使用如下内容创建 /etc/puppet/modules/user/manifests/sysadmins.pp 文件:
class user::sysadmins { realize( User["john"], User["graham"] ) }
在一个节点中添加如下代码:
include user::virtual include user::sysadmins include user::developers
运行 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"] )
}
之后便可以在任何需要的地方包含这些组,而不用担心因为多次定义同一个用户而产生的冲突。
参见本书
本章的 使用虚拟资源 一节
本章的 管理用户的自定义文件 一节