計画の一部として、DirXMLドライバを実行するサーバに特定のeDirectoryオブジェクトが複製されていることを確認する必要があります。
フィルタ済みレプリカを使用できます。ただし、ドライバが読み込むか同期化する必要があるすべてのオブジェクトと属性がフィルタ済みレプリカに含まれていることが条件です。
DirXMLドライバオブジェクトには、同期化するあらゆるオブジェクトに対する十分なeDirectory権限を与える必要があります。これは、明示的に権限を付与するか、ドライバオブジェクトのセキュリティを、必要な権限を持つオブジェクトと同等にすることによって行います。
DirXMLドライバが実行されているeDirectoryサーバ(または、リモートローダを使用している場合はドライバが参照するeDirectoryサーバ)は、次のマスタレプリカまたは読み書き可能レプリカを保持している必要があります。
Identity Managerを実行している各サーバに1つのドライバセットオブジェクトが必要です。特に必要でない限り、同じドライバセットオブジェクトに複数のサーバを関連付けないでください。
注: ドライバセットオブジェクトを作成する場合、デフォルトでは別々のパーティションが作成されるよう設定されていますが、これは必須ではありません。
サーバオブジェクトによってドライバはオブジェクトのキーペアを生成できるため、サーバオブジェクトが必要です。また、リモートローダ認証にも重要です。
これらのドライバのレプリカがドライバと同じサーバ上にない限り、ドライバはオブジェクトを同期化できません。実際に、DirXMLドライバは、ユーザがルール(「スコープフィルタ処理」のルール)を作成して別の方法を指定している場合を除き、サーバ上で複製された「すべて」のコンテナに含まれるオブジェクトを同期化します。
たとえば、特定のドライバですべてのユーザオブジェクトを同期化する場合、最も簡単な方法は、ユーザ全員のマスタレプリカまたは読み書き可能レプリカを保持するサーバ上で、そのドライバの1つのインスタンスを使用する方法です。
ただし、多くの環境では、1つのサーバにユーザ全員のレプリカが含まれるのではなく、ユーザの完全なセットが複数のサーバに分散されています。この場合、次の2つの方法があります。
ユーザを1つのサーバに集約する。 既存のサーバにレプリカを追加することによって、すべてのユーザを保持する1つのサーバを作成できます。必要なユーザオブジェクトと属性がフィルタ済みレプリカの一部である限り、フィルタ済みレプリカを使用すると、eDirectoryデータベースのサイズを削減できます。
スコープフィルタ処理によって複数のサーバ上でドライバの複数のインスタンスを使用する。 1つのサーバにユーザを集約「しない」場合は、どのサーバセットにすべてのユーザを保持するかを決定し、これらの各サーバにDirXMLドライバの1つのインスタンスを設定する必要があります。
ドライバの別個のインスタンスが同じユーザを同期化しないようにするために、「スコープフィルタ処理」を使用して、ドライバの各インスタンスでどのユーザを同期化するかを定義する必要があります。スコープフィルタ処理とは、各ドライバにルールを追加して、ドライバの管理のスコープを特定のコンテナに制限することです。スコープフィルタ処理を使用した別のサーバ上のユーザの管理 を参照してください。
DirXMLドライバでは、ユーザを作成するためのeDirectoryテンプレートオブジェクトを指定する必要はありません。ただし、eDirectory内にユーザを作成する際にドライバがテンプレートを使用するように指定した場合は、ドライバを実行しているサーバ上にテンプレートオブジェクトを複製する必要があります。
たとえば、Inactive Userというコンテナを作成して、無効になっているユーザアカウントを保持する場合、ドライバを実行しているサーバ上に、そのコンテナのマスタレプリカまたは読み書き可能レプリカ(可能であればマスタレプリカ)が必要です。
その他のオブジェクトがドライバによって読み込まれるだけで変更されない場合は、サーバ上のこれらのオブジェクトのレプリカには読み込み専用レプリカを使用できます。
スコープフィルタ処理とは、各ドライバにルールを追加して、ドライバのアクションのスコープを特定のコンテナに制限することです。次に、スコープフィルタ処理が必要になる2つの状況を示します。
DirXMLドライバは、デフォルトで、DirXMLドライバが実行されているサーバ上に複製されているすべてのコンテナ内のオブジェクトを同期化します。このスコープを絞り込むには、スコープフィルタ処理ルールを作成する必要があります。
1つのサーバ上でユーザを複製することなくユーザ全員を同期化するには、すべてのユーザを保持するサーバセットを決定し、これらの各サーバ上にDirXMLドライバのインスタンスを作成する必要があります。ドライバの2つのインスタンスが同じユーザを同期化しないようにするために、スコープフィルタ処理を使用して、ドライバの各インスタンスがどのユーザを同期化するかを定義する必要があります。
注: 現在、サーバのレプリカが重複していなくても、スコープフィルタ処理を使用することをお勧めします。今後サーバにレプリカを追加すると、意図せずレプリカが重複してしまうことがあります。スコープフィルタ処理を使用すると、サーバにレプリカを追加しても、DirXMLドライバが同じサーバを同期化することはありません。
次に、スコープフィルタ処理の使用例を示します。
次の図は、ユーザが格納された3つのコンテナであるMarketing、Finance、およびDevelopmentを持つツリーを示します。各コンテナは別個のパーティションです。
この例では、次の図に示すように、eDirectory管理者はServer AとServer Bという2台のeDirectoryサーバを管理しています。どちらのサーバにもすべてのユーザのコピーは含まれません。各サーバには3つのパーティションのうち2つが含まれるため、サーバが保持するスコープが重複しています。
管理者は、ツリー内のすべてのユーザをGroupWiseドライバで同期化したいと考えていますが、ユーザのレプリカを1つのサーバに集約しようとは考えていません。このため、GroupWiseドライバの2つのインスタンスを各サーバで1つずつ使用することにしました。管理者はIdentity Managerをインストールし、各eDirectoryサーバにGroupWiseドライバを設定します。
Server AはMarketingコンテナとFinanceコンテナのレプリカを保持しています。また、このサーバにはIdentity Managerコンテナのレプリカもあり、このレプリカにServer AのドライバセットとServer AのGroupWiseドライバオブジェクトが保持されています。
Server Bには、DevelopmentコンテナとFinanceコンテナのレプリカ、およびServer BのドライバセットとServer BのGroupWiseドライバオブジェクトを格納するIdentity Managerコンテナが保持されいます。
Server AとServer Bの両方にFinanceコンテナのレプリカが保持されているため、Financeコンテナ内に存在するユーザJBassadは、両方のサーバに保持されています。スコープフィルタ処理を使用しない場合、GroupWiseドライバAとGroupWiseドライバBの両方がJBassadを同期化します。
次の図は、スコープフィルタ処理を使用して、ドライバの2つのインスタンスが同じユーザを管理しないようにしていることを示します。これは、スコープフィルタ処理によって、各コンテナを同期化するドライバを定義しているためです。
次に、スコープフィルタ処理のルールを作成する方法のサンプルを示します。このルールは、Subscriber Event Transformationスタイルシートに記述します。
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:jstring="http://www.novell.com/nxsl/java/java.lang.String"
exclude-result-prefixes="jstring">
<!--
To select different containers for scoping, add/delete/modify the <value>
elements in the body of the variable "in-scope-containers-rtf"
Note that if the container is not in the root of the tree, then the DN
(minus the tree name) of the container must be specified, e.g.,
Corporate\Executives
Note:THESE MUST BE ENTERED IN THE TABLE AS ALL UPPERCASE
-->
<xsl:variable name="in-scope-containers-rtf">
<value>CORPORATE\USERS\ACTIVE</value>
<value>CORPORATE\USERS\INACTIVE</value>
</xsl:variable>
<xsl:variable name="in-scope-containers" select="document('')/xsl:transform/xsl:variable[@name='in-scope-containers-rtf']/value"/>
<!--
"identity" transformation - copies unchanged everything not explicitly
matched by other templates
-->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- throw away events that are out of scope -->
<xsl:template match="input/*[@src-dn]">
<xsl:variable name="in-scope">
<xsl:call-template name="in-scope"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="$in-scope = '1'">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:message>
<status level="warning">Operation vetoed by Event Transformation
Rule - out of scope</status>
</xsl:message>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--
check to see if an object is in the scope defined by the variable
"in-scope-containers"
-->
<xsl:template name="in-scope">
<!-- validate that the container is in scope -->
<xsl:variable name="src-dn" select="substring-after(substring-after(@src-dn,'\'),'\')"/>
<xsl:variable name="src-dn-i" select="jstring:lastIndexOf($src-dn,'\')"/>
<xsl:if test="$src-dn-i != -1">
<xsl:variable name="src-dn-container" select="jstring:substring($src-dn, 0, $src-dn-i)"/>
<!--
the following test takes advantage of the XPath existential
quantification semantics:
basically, if one node in the node-set has a string value that matches
the string, then the statement is true
-->
<xsl:if test="jstring:toUpperCase($src-dn-container) = $in-scope-containers">
<xsl:value-of select="'1'"/>
</xsl:if>
</xsl:if>
</xsl:template>
</xsl:transform>