次のファイルは、構成用に使用されます。
マスターエージェントリソース構成ファイル
エージェント登録ファイル
エージェントアクセス制御ファイル
マスターエージェント状態ファイル
エージェントリソース構成ファイルは、マスターエージェントによってのみ使用されます。マスターエージェントが実行状態になった直後に、このファイルが読み込まれます。 このファイルには、マスターエージェントが管理するすべてのエージェントについての情報が保存されます。この構成ファイル内の各エントリには、サブエージェントの起動方法も指定されています。サブエージェントに構成ファイルがなくても、そのサブエージェントが動作可能になると、動的にマスターエージェントに登録されます。サブエージェントの動的な呼び出しと登録の詳細は、「サブエージェントについて」を参照してください。
エージェントに対してマスターエージェントによる呼び出しと静的な登録が選択されていると、そのエージェントは独自のリソース構成ファイルを持つことができます。このファイルには、サブエージェントの呼び出しに関する情報に加えて、サブエージェントに関連付けられている登録ファイルについての情報が含まれています。エージェント登録ファイルについては、「エージェント登録ファイル」を参照してください。
<ResourceFile> : Resource | Environment Resource <Resource> : "resource" "=" "{" ResourceList "}" <ResourceList> : /*empty*/ | ResourceList ResourceItem <ResourceItem> : "{" StringList "}" <Environment> : "environment" "=" "{" EnvironmentList "}" <EnvironmentList> : /*empty*/ | EnvironmentList EnvironmentListItem <EnvironmentListItem> : EnvironmentToken "=" Number <EnvironmentToken> : "poll-interval" | "Max-agent-time-out" <Number> : Integer <StringList>: StringItem | StringList StringItem <StringItem> : StringToken "=" QuotedString <StringToken> : "registration_file" |"policy" | "command" |'type"|"user" <QuotedString> : """ AlphanumericString """
snmpdx.rsrc ファイルと mibiisa.rsrc ファイルの例を次に示します。
構成ファイルで使う変数は、例のように記述します。コメント行は、# の文字で始めます。
snmpdx.rsrc environment = { poll-interval = 5 # This is in seconds max-agent-time_out = 10000000 # This is microseconds } mibiisa.rsrc resource = { { registration_file = /etc/snmp/conf/mibiisa.reg security = "/etc/snmp/conf/snmpd.conf type = "legacy" policy = "spawn" command = "/usr/lib/bin/mibiisa -p $PORT" } }
environment グループは、マスターエージェントのふるまいを制御します。このグループには、次の 2 つの変数が含まれます。
poll-interval - このフィールドの値は、秒単位で指定します。マスターエージェントは、指定した間隔をおいて SNMP メッセージの送受信以外の処理を実行します。また、すべてのエージェントが応答するかどうかを調べることによって、リソースファイルに変更が発生したことがわかると、機能を維持するために必要となる定型的な処理を行います。
max-agent-time-out - このフィールドの値は、マイクロ秒単位で指定します。この変数は、サブエージェントが登録の際に要求できる最大許容タイムアウト値を表します。たとえば、マスターエージェントは、サブエージェントに要求を送るとタイムアウトの間は応答を受信するのを待ちます。このタイムアウト値は、登録ファイル内で指定します。または、動的登録によって指定されることもあります。エージェントがこのタイムアウト値にあまりにも大きな値を設定すると、マスターエージェントや他のエージェントで問題が生じます。そのような問題を避けるために、マスターエージェントがサブエージェントからの応答を待つタイムアウトの最大値を、マスターエージェントで指定する必要があります。そのタイムアウトの最大値が、この変数を使って指定できる最大許容タイムアウト値です。
resource グループの変数は、サブエージェントにだけ関係します。前述の例の構成ファイルには、2 つのエントリが含まれています。各エントリはそれぞれのサブエージェントに対応しています。エントリには、値の指定された次の変数を記述できます。
registration_file - このフィールドには、それぞれのサブエージェントの登録構成ファイルを指定します。マスターエージェントは、このフィールドに指定されたファイルからさまざまなエントリを読み込み、MIB テーブルに適切なエントリを作成します。このファイルの詳細は、「エージェント登録ファイル」を参照してください。このエントリは、すべてのレガシータイプのエージェントに必須です。この変数にフルパスで値が指定されていなければ、プログラムは、デフォルトのディレクトリ /etc/snmp/conf を調べます。
policy - このフィールドには、load および spawn の 2 つの値を指定できます。値に load が指定されていると、マスターエージェントは登録エントリを読み込んで、MIB テーブルの行エントリを作成します。値に spawn が指定されていると、マスターエージェントは、command フィールドの指定内容に従ってそれぞれのサブエージェントを呼び出します。
command - このフィールドには、サブエージェントの実行形式の名前を指定します。command にはフルパスを指定します。この変数にフルパスで値が指定されていなければ、プログラムは、デフォルトのディレクトリ /usr/lib/bin を調べます。command では、 $PORT マクロを使用して、サブエージェントが SNMP 要求を受信するポート番号を指定することができます。$PORT の値は、各サブエージェントの登録ファイルの内容に従ってマスターエージェントが割り当てます。$PORT マクロが必要とされるのは、レガシーエージェントやサブエージェントが、-p、-n、-port などのポートオプションに対して異なる引数を取ることがあるためです。
エージェントにはそれぞれ、固有のエージェント登録ファイルがあります。このため、マスターエージェントとサブエージェントがそれぞれに変更を加えたファイルを持つことになります。登録ファイルには、それぞれのエージェントに直接関係のある情報が収められています。また、エージェントの名前、エージェントによって管理されているサブツリー OID、要求のタイムアウト、選択されたポート番号も含まれています。このファイル内の各エントリの書式の例を次に示します。
<Config> : <Macro> <Agents> <Macro> : "macros" "=" "{" <MacrosList>"}" <MacrosList> : <MacrosList> <MacroItem> | empty <MacroItem> : label "=" <SubidList> <SubidsLis> : <SubidsList> "." <Subid> | <Subid> <Subid> : "mib2" | "sun" | "enterprise" | identifier | number <Agents> : "agents" "=" "{" <AgentList> "}" <AgentList> : <AgentList> <AgentItem> | <AgentItem> <AgentItem> : "{" <Name> <SubtreesTables> <TimeOut> <WatchDogTimer> <Port>"}" <Name> : label "=" quotestring <SubtreesTables> : <SubtreesTables> | <Subtrees> | <Tables> <Subtrees> : "subtrees" "=" "{" <SubtreesList> "}" <SubtreesList> : <SubtreesList> "," <SubtreeItem> | <SubtreeItem> | empty <SubtreeItem> : <SubidsList> <Tables> : "tables" "=" "{" <TableList>"}" <TableList> : <TableList> <TableItem> | empty| <TableItem> : "{" <Table> <Columns> <Indexs> "}" <Table> : "table" "=" <SubidsList> <Columns> : "column" "=" <Range> <Range> : "[" number "]" | number <Index>s : "indexs" "=" <Range> <TimeOut> : "timeout" "=" number <WatchDogTimer>: "watch-dog-time" "=" number <Port> : "port" = number
登録ファイルの名前には、拡張子を付けることができます。その場合、reg という拡張子にすることをお勧めします。実際のサブツリーのファイルの例を次に示します。
macros = { applicationTable = mib-2.27 sun = enterprise.42 } agents = { { name = "ExampleAgent" subtrees = { mib-2, sun } tables = { { #begin table table = applicationTable columns = [ 2 -15 ] indexes = [ 2 -3 ] } #end table } #end of tables timeout = 20000 # Optional. Each SNMP request time out. This is in microseconds. watch_dog_time = 300 # This is in seconds port = 4000 # Optional } } #end of agents
この構成ファイルは、次のような 2 つの情報のグループで構成されています。
name - この変数には、サブエージェントの名前を指定します。別のプロセスとして呼び出される複数のエージェントの実行形式ファイルが同じでも、エージェント名は一意でなければなりません。マスターエージェントは、エージェントテーブル MIB 内のキーとしてエージェント名を使います。
subtrees - この変数には、特定のエージェントによって管理されているサブツリー OID のリストを指定します。サブエージェントは複数のツリーを管理できます。前述のサブツリーの例では、ExampleAgent という名前のエージェントが、mib-2 と sun というサブツリーを管理しています。
tables - MIB テーブル全体またはテーブルの一部を管理するように、サブエージェント登録ファイルを構成できます。tables グループには、テーブル名、カラム番号、および特定の行番号 (indexes) を指定します。前述のサブツリーの例では、ExampleAgent が、サブツリー mib-2 と sun のほかに、そのアプリケーションテーブルのカラム 2〜15 と行 2〜3 を管理しています。
timeout - timeout 変数はマスターエージェントに登録されます。マスターエージェントは、timeout で指定された時間 (単位 : マイクロ秒)、SNMP 要求に対する応答を受信するのを待ちます。timeout には、マスターエージェントのリソース構成ファイルであらかじめ定義されている max_agent_time_out を超えない適切な値を設定します。
watch_dog_time - マスターエージェントはこのタイムアウトを使って、サブエージェントが実行状態であるかどうかを判断します。watch_dog_time の間にマスターエージェントとサブエージェントのあいだにアクティビティがない場合にだけ、マスターエージェントはサブエージェントに対してポーリングを行います。
port - マスターエージェントから SNMP 要求を受信するためにサブエージェントが待機しているポート番号を指定します。この変数は省略可能です。通常、サブエージェントは、この変数に値を割り当てません。この変数が構成ファイルにない場合、マスターエージェントは、オープンしていないポートを検索し、そのポート番号を使用して各サブエージェントを呼び出します。port に値が割り当てられている場合、マスターエージェントは、その特定のポート番号を使用してサブエージェントを呼び出します。サブエージェントは、マスターエージェントのリソースファイル内の command 変数に従って呼び出されます。
Solstice Enterprise Agents のライブラリを使って開発された動的なエージェントは、マスターエージェントで呼び出す必要はありません。この場合は、マスターエージェントのリソースファイル内には、そのようなエージェントに対するエントリがないことがあります。このようなエージェントは、エージェント自身で利用可能なポートをオープンします。
エージェントアクセス制御ファイルは、SNMP 関連のコミュニティ情報を保存する構成ファイルです。各サブエージェントとマスターエージェントには、独自のアクセス制御ファイルがあります。このファイル名には拡張子を付けることができます。拡張子は acl にすることをお勧めします。このファイルは、/etc/snmp/conf というディレクトリに保存する必要があります。
<snmp_security> : <acls> <trap_block> <acls> : /*empty*/ | "acl" "=" {<acls_list> } <acls_list> : /*empty*/ | <acls_list> <acl_item> <acl_item> : {<communities_stmt> <acl_access> <hosts> } <communities_stmt> : "communities" "=" <communities_set> <communities_set> : <communities_set> , <community_elem> | <community_elem> <community_elem>: alphanumeric_string <acl_access> : "access" "=" <acl_access_type> <acl_access_type> : read-only | read-write <hosts> : "managers" "=" <hosts_list> <hosts_list> : <hosts_list> , <host_item> | <host_item> <host_item> : alphanumeric_string <trap_block> : "trap" "=" { <traps_list> } <traps_list> : /*empty*/ | <trap_list> < trap_item> <trap_item> : { <trap_community_string> <trap_interest_hosts> <enterprise_list> } <trap_community_string> : "trap-community" "=" alphanumeric_string <trap_interest_hosts_list> : <trap_interest_hosts_list> , <trap_interest_host_item> | <trap_interest_host_item> <trap_interest_host_item> : alphanumeric_string <enterprise_list> : /*empty*/ | <enterprise_list> <enterprise_item> <enterprise_item> : { <enterprise_stmt> <trap_number_stmt> } <enterprise_stmt> : "enterprise" "=" quouted_alphanumeric_string <trap_number_stmt> : "trap-num" "=" <trap_number_list> <trap_number_list> : <trap_number_item> <trap_number_item> : <trap_range> <trap_range> : integer - integer | integer
acl = { { communities = public, private access = read-only managers = hubble, snowbell, nanak } { communities = jerry access = read-write managers = hubble, telescope } } trap = { { trap-community = SNMP-trap hosts = hubble, snowbell { enterprise = "Sun" trap-num = 1, 2-5 } { enterprise = "3Com" trap-num = 4 } } { trap-community = competitor-trap hosts = hp_server, ibm_server, sgi { enterprise = "sun" trap-num = 1,3 } { enterprise = "snmp" trap-num = 1-32 } } }
アクセス制御リストファイルには、2 つのグループの構成変数が保存されています。
acl - このグループの変数は、コミュニティ名、アクセス権、および SNMP 要求を受け付けるホスト名の 3 つが 1 組となって定義され、それが多数記述されます。なお、あらかじめ設定しておいたコミュニティ名が含まれていなければ、この SNMP 要求は受け付けられません。前述のアクセス制御リストファイルの例では、public と private というコミュニティ名を含むホスト hubble、snowbell、および nanak からの GET および GET_NEXT SNMP 要求だけが受け付けられます。このグループには、3 つの組み合わせを複数指定できます。
マスターエージェントには、SNMP PDU を受け取るための適切なアクセス権とコミュニティがあります。ただし、同じ SNMP PDU がサブエージェントに転送される場合、マスターエージェントは受信するための適正な権限がなかったり、適正なコミュニティが含まれていない場合、その PDU を拒否することがあります。マスターエージェントに適切なコミュニティとアクセス権がなければ、サブエージェントに SNMP PDU を受信するためのアクセス権とコミュニティがあったとしても、そのような PDU はサブエージェントに到達することはありません。
trap - この変数のグループは、サブエージェントから受信するトラップを送信したり、転送したりするための情報で構成されます。マスターエージェントは、トラップを転送する際にこのグループで指定された情報を使います。この情報には、構成されたトラップ番号を送るためのホスト名を指定します。トラップの PDU には、指定したトラップのコミュニティが含まれます。これらのトラップは、最初にサブエージェントによって生成され、次にマスターエージェントに送信されます。
マスターエージェントの状態ファイルには、マスターエージェントによって生成されたさまざまなサブエージェントに関する情報が保存されています。マスターエージェントのみがこのファイルを使用します。マスターエージェントはこのファイルに情報を動的に追加します。そのため、その情報を自分で編集する必要はありません。マスターエージェントがサブエージェントのプロセスを生成するたびに、このファイルにエントリが作成されます。このファイルは、マスターエージェントに障害が生じて動作しなくなってしまった場合に、マスターエージェントを復旧するためのものです。マスターエージェントを再起動すると、このファイル内のエントリによって、以前に作成されたサブエージェントや対応するポート番号が示されます。マスターエージェントは、このファイル内の各エントリを読み込み、それをマスターエージェントのリソース構成ファイル内のエントリと比較します。そのエントリがリソースファイル内になければ、マスターエージェントはそのプロセスを終了します。エントリが両方のファイル内に存在する場合、マスターエージェントはポートを使用してサブエージェントへのアクセスを試みます。
Solstice Enterprise Agents 技術を有効利用するために、サン・マイクロシステムズ社固有のエンタープライズ MIB OID 配下にテーブルが 3 つ定義されています。次のテーブルの例は、すべてのサブエージェントの管理特性を提供するためのものです。このテーブル内の情報で、サブエージェントに固有の情報を提供しています。このテーブルには、サブエージェントの名前とサブエージェントのポート番号が収められています。各サブエージェントによって管理されているサブツリーの OID の例は示してありません。
すべての種類の MIB 変数を含む MIB の例を次に示します。MIB にはテーブルも組み込まれています。この MIB が mibcodegen を通じて実行されると、適切な MIB データベースとスタブコードが生成されます。これによって、この MIB のサブエージェントが構築されます。
DEMO-MIB DEFINITIONS ::= BEGIN IMPORTS OBJECT-TYPE, Counter32, Gauge32 FROM SNMPv2-SMI DisplayString, TimeStamp FROM SNMPv2-TC; mib-2 OBJECT IDENTIFIER ::= { mgmt 1 } sun OBJECT IDENTIFIER ::= { enterprises 42 } demo OBJECT IDENTIFIER ::= { sun 1000 } -- -- Some objects -- demoString OBJECT-TYPE SYNTAX DisplayString MAX-ACCESS read-write STATUS current DESCRIPTION "A read-write object of type String." ::= {demo 1} demoInteger OBJECT-TYPE ::= {demoTable 1} DemoEntry ::= SEQUENCE { demoEntryIndex INTEGER, demoEntryString DisplayString, demoEntryInteger INTEGER, demoEntryOid OBJECT IDENTIFIER } SYNTAX INTEGER { up(1), down(2) } MAX-ACCESS read-write STATUS current DESCRIPTION "A read-write object of type Integer." ::= {demo 2} demoOid OBJECT-TYPE SYNTAX OBJECT IDENTIFIER MAX-ACCESS read-write STATUS current DESCRIPTION "A read-write object of type Oid." ::= {demo 3} -- A table composed of some columns demoTable OBJECT-TYPE SYNTAX SEQUENCE OF DemoEntry MAX-ACCESS not-accessible STATUS current DESCRIPTION "A table." ::= {demo 10} demoEntry OBJECT-TYPE SYNTAX DemoEntry MAX-ACCESS not-accessible STATUS current DESCRIPTION "An entry in the table demoTable." INDEX {demoEntryIndex} demoEntryIndex OBJECT-TYPE SYNTAX INTEGER (1..2147483647) MAX-ACCESS not-accessible STATUS current DESCRIPTION "An index to uniquely identify the entry." ::= {demoEntry 1} demoEntryString OBJECT-TYPE SYNTAX DisplayString MAX-ACCESS read-write STATUS current DESCRIPTION "A read-write column of type String." ::= {demoEntry 2} demoEntryInteger OBJECT-TYPE SYNTAX INTEGER { up(1), down(2) } MAX-ACCESS read-write STATUS current DESCRIPTION "A read-write column of type Integer." ::= {demoEntry 3} demoEntryOid OBJECT-TYPE SYNTAX OBJECT IDENTIFIER MAX-ACCESS read-write STATUS current DESCRIPTION "A read-write column of type Oid." ::= {demoEntry 4} demoTrap TRAP-TYPE ENTERPRISE sun VARIABLES { demoInteger, demoString, demoOid} DESCRIPTION " Trap for testing." ::= 2 demoColdLinkTrap TRAP-TYPE ENTERPRISE snmp DESCRIPTION " Trap for testing." ::= 0 END