系统管理指南:名称和目录服务(DNS、NIS 和 LDAP)

添加项对象

NIS+LDAPmapping(4) 详细指定了表项映射的语法和语义,还举例说明了如何使用每个语义元素。但是,最简单且最不易出错的方法通常是标识与所需映射相似的现有映射,然后复制并修改这个现有映射。

例如,假定您有一个名为 nodeinfo 的 NIS+ 表,该表用于存储节点的清单和属主信息。假定该 NIS+ 表是通过以下命令创建的。


# nistbladm -c -D access=og=rmcd,nw=r -s : nodeinfo_tbl \

cname=S inventory=S owner= nodeinfo.`domainname`.

cname 列中应当包含节点的标准名称,换言之,与节点的 hosts.org_dir 表中 cname 列的值相同。

还做出以下假定:相应的信息保存在 LDAP 中的 ou=Hosts 容器中,nodeInfo 对象类(在本示例中为新创建的对象类,而不是在 RFC 中定义的对象类)将 cn 用作 MUST 属性,nodeInventorynodeOwner 是 MAY 属性。

为了将现有的 nodeinfo 数据上载到 LDAP 中,在单独的文件中新建映射属性将会很方便。例如,可以使用 /var/nis/tmpmapping

  1. 创建一个数据库 ID 来标识要映射的 NIS+ 表。


    nisplusLDAPdatabaseIdMapping	nodeinfo:nodeinfo
  2. nodeinfo 表中的项设置 TTL。由于极少对这些信息进行更改,因此请将 TTL 设置为十二个小时。当 rpc.nisd 守护进程首次从磁盘中加载 nodeinfo 表时,该表中项的 TTL 将随机选择为六到十二个小时之间的值。


    nisplusLDAPentryTtl		nodeinfo:21600:43200:43200
  3. 标识与要创建的映射具有相似属性的现有映射。在本示例中,映射属性值非常简单(直接赋值),而将 LDAP 数据存储到现有容器中则较为复杂,因此,在删除 nodeinfo 数据的过程中一定要格外小心。如果不希望删除整个 ou=Hosts 项,而只希望删除 nodeInventorynodeOwner 属性,则将需要一个特殊的删除规则集。

    总之,就是要查找一个共享容器且具有删除规则集的映射。一个可能的备选项就是 netmasks 映射,该映射共享 ou=Networks 容器,而且确实具有一个删除规则集。

  4. 模板映射 netmasks 具有缺省映射(位于 /var/nis/NIS+LDAPmapping.template 中),如下所示:


    nisplusLDAPobjectDN	netmasks:ou=Networks,?one?objectClass=ipNetwork,\
    
     													ipNetMaskNumber=*:\
    
    											ou=Networks,?one?objectClass=ipNetwork:
    
    														dbid=netmasks_del

    在转移到新的 nodeinfo 映射之后,数据库 ID 应当为 nodeinfo,容器应当为 ou=Hosts,对象类应当为 nodeInfo。因此,nodeinfo 映射的第一行将变为:


    nisplusLDAPobjectDN	nodeinfo:ou=Hosts,?one?objectClass=nodeInfo,\

    netmasks 映射的第二行是搜索过滤器的一部分,它只选择那些包含 ipNetMaskNumber 属性的 ou=Networks 项。在本示例中,它选择那些具有以下 nodeInventory 属性的 ou=Hosts 项:


    nodeInventory=*:\

    第三行和第四行是 nisplusLDAPobjectDN 的写入部分,它们指定 nodeinfo 数据在 LDAP 中的写入位置以及在删除 nodeinfo 数据时所使用的规则集。在本例中,创建一个由数据库 ID nodeinfo_del 标识的删除规则集。因为您总是写入 ou=Hosts 中的现有项,所以只需要为 nodeinfo 数据属性指定对象类,如下所示:


    ou=Hosts,?one?objectClass=nodeInfo:\
    
    								dbid=nodeinfo_del
    
    	

    将所有这些汇总到一起,nisplusLDAPobjectDN 将如下所示:


    nisplusLDAPobjectDN	nodeinfo:ou=Hosts,?one?objectClass=nodeInfo,\
    
    					 							nodeInventory=*:\
    
    											ou=Hosts,?one?objectClass=nodeInfo:\
    
    												dbid=nodeinfo_del
  5. 创建一个将 nodeinfo 数据从 NIS+ 映射到 LDAP 的规则集。模板(来自 netmasks)如下所示:


    nisplusLDAPattributeFromColumn \
    
    		netmasks:	dn=("ipNetworkNumber=%s,", addr), \
    
    						ipNetworkNumber=addr, \
    
    						ipNetmaskNumber=mask, \
    
    						description=comment

    在本例中,ou=Hosts 容器会使情况更复杂,因为 RFC 2307 中规定 dn 中应当包含 IP 地址。但是,IP 地址不存储在 nodeinfo 表中,因此您必须以其他方式获取它。幸运的是,模板文件中的 crednode 映射说明了如何获取 IP 地址。


    nisplusLDAPattributeFromColumn \
    
    		crednode:	dn=("cn=%s+ipHostNumber=%s,", \
    
    								(cname, "%s.*"), \
    
    			ldap:ipHostNumber:?one?("cn=%s", (cname, "%s.*"))), \

    因此,您可以复制 crednode 映射的这一部分。但是,在本例中,cname 列的值是实际的主机名(而非主体名),因此,您不必单独提取 cname 的某个部分,而是可以明确替换属性名和列名,此时 nodeinfo 映射将变为:


    nisplusLDAPattributeFromColumn \
    
    		nodeinfo:	dn=("cn=%s+ipHostNumber=%s,", cname, \
    
    			ldap:ipHostNumber:?one?("cn=%s", cname)), \
    
    				nodeInventory=inventory, \
    
    				nodeOwner=owner
  6. 将数据从 LDAP 映射到 NIS+ 时,模板的 netmasks 项如下所示:


    nisplusLDAPcolumnFromAttribute \
    
    		netmasks:	addr=ipNetworkNumber, \
    
    				mask=ipNetmaskNumber, \
    
    				comment=description

    在替换属性名和列名之后,结果如下所示:


    nisplusLDAPcolumnFromAttribute \
    
    		nodeinfo:	cname=cn, \
    
    				inventory=nodeInventory, \
    
    				owner=nodeOwner
  7. netmasks 的删除规则集如下所示:


    nisplusLDAPattributeFromColumn \
    
    		netmasks_del:	dn=("ipNetworkNumber=%s,", addr), \
    
    				ipNetmaskNumber=

    以上规则集指定当 NIS+ 中的 netmasks 项被删除时,相应 ou=Networks LDAP 项中的 ipNetmaskNumber 属性也会被删除。在本例中,删除的是 nodeInventorynodeOwner 属性。因此,使用步骤 5 中的 dn 规范时,结果如下所示:


    nisplusLDAPattributeFromColumn \
    
    		nodeinfo_del:	dn=("cn=%s+ipHostNumber=%s,", cname, \
    
    			ldap:ipHostNumber:?one?("cn=%s", cname)), \
    
    				nodeInventory=, \
    
    				nodeOwner=

    映射信息完整无缺。

  8. 停止 NIS+ 服务并随后启动它,以便开始使用映射文件。


    # svcadm disable network/rpc/nisplus:default
    

  9. 如果 NIS+ nodeinfo 表中已经有数据,请将这些数据上载到 LDAP 中。将新的 nodeinfo 映射信息放到一个单独的文件 /var/nis/tmpmapping 中。


    # /usr/sbin/rpc.nisd -D -m /var/nis/tmpmapping \
    
    -x nisplusLDAPinitialUpdateAction=to_ldap \
    
    -x nisplusLDAPinitialUpdateOnly=yes
    
  10. 将临时文件 /var/nis/tmpmapping 中的映射信息添加到实际映射文件中。这可以借助于编辑器来完成,也可以按以下方式附加数据(假定实际映射文件为 /var/nis/NIS+LDAPmapping)来完成:


    # cp -p /var/nis/NIS+LDAPmapping \
    
    /var/nis/NIS+LDAPmapping.backup
    

    # cat /var/nis/tmpmapping >> /var/nis/NIS+LDAPmapping
    

    注意 – 注意 –

    请注意双箭头 ">>" 表示重定向。单箭头 ">" 表示将覆写目标文件。


  11. /lib/svc/method/nisplus 文件中添加 -m 选项。还可以根据需要添加 -Y-B 选项。有关更多信息,请参见NIS+ 到 LDAP 转换工具和服务管理工具

  12. 启动 NIS+ 服务。


    # svcadm enable network/rpc/nisplus:default