使用虚拟资源管理用户
用户管理是使虚拟资源能派上用场的另一个很好的例子。考虑下面的设置。 你有三个用户: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"] ) }
之后便可以在任何需要的地方包含这些组,而不用担心因为多次定义同一个用户而产生的冲突。
参见本书
本章的 使用虚拟资源 一节
本章的 管理用户的自定义文件 一节