プライマリ・コンテンツに移動
Oracle® Enterprise Managerコマンドライン・インタフェース
13c リリース2 PG
E79390-06
目次へ移動
目次

前
次

3 EM CLIの使用

この章では、Enterprise Managerコマンドライン・インタフェース(EM CLI)の次のトピックについて説明します。

3.1 コマンドラインEM CLIの使用

コマンドラインEM CLIは、EM CLI Verbを起動する伝統的な方法であり、最も直接的な方法です。システム・プロンプトからの基本構文は次のとおりです。

emcli verb_name -required_parameter1 -required_parameter2 ... -optional_parameter1 -optional_parameter2 ...

特定のVerbの構文は、コマンドから起動した使用例にも、プログラムによる使用例にも適用されます。たとえば、create_group Verbの構文は次のとおりです。

emcli create_group
      -name="name"
      [-type=<group>]
      [-add_targets="name1:type1;name2:type2;..."]...
      [-is_propagating="true/false"]

これは、-nameパラメータは必須である一方、角カッコで囲まれた-typeパラメータ、-add_targetsパラメータおよび-is_propagatingパラメータはオプションであることを示します。この例では、このVerbをコマンドライン・プロンプトでどのように使用できるかを示します。

emcli create_group -name=db_group
      -add_targets="emp_rec:oracle_database"
      -add_targets="payroll:oracle_database"

「Verbのカテゴリ」には、ほとんどのEM CLI Verbについて、書式、必須パラメータとオプション・パラメータの説明、および例が示されています。記載されているものについては、次のコマンドを入力することによってオンライン・ヘルプで参照できます。

emcli help verb_name

3.2 対話モードまたはスクリプト・モードでのEM CLIの使用

「EM CLIの概要および概念」で紹介したように、EM CLIでは対話モードとスクリプト・モードを提供し、標準のコマンドライン起動によって提供される基本機能を拡張します。対話モードとスクリプト・モードの機能はどちらも同じです。明示的に記述している場合を除き、この章で提供する情報は対話モードとスクリプト・モードの両方に関連します。

次の項で、EM CLIの対話モードまたはスクリプト・モードに関連する基本的な原理について説明します。

ヒント:

スクリプト・モードおよび対話モードでEM CLIを使用するデモンストレーションは、次のリンクをクリックして、Enterprise Manager Screenwatchを表示してください。

  • スクリプト・モードでのEM CLIの開始

  • 対話モードでのEM CLIのダウンロードおよび開始

3.2.1 Jythonインタープリタ

Enterprise Manager Cloud Control version 12cR3から、EM CLIに、すべてのVerbがEM CLI Verb関数、または単純に関数と呼ばれる関数として登録された組込みJythonインタープリタ(Jython 2.5.3)が搭載されました。これらの関数の使用方法は、対応するVerbと同様です。これらの関数では、パラメータ(キーと値のペアとして指定)は、Verbの引数に存在するものです。

対話モードでは、インタープリタによって、コマンドを入力できるシェルが開きます。スクリプト・モードでは、Jythonプログラムをインタープリタに非対話形式で渡して実行できます。どちらのモードでも、EM CLI Verb関数を使用するだけでなく、Jythonで通常のプログラミングを行うこともできます。

3.2.2 スクリプト・モードおよびインタラクティブ・モードの構文

これら2つのモードの構文は、多少異なります。

スクリプトの実行:

emcliと入力し、次の例に示すとおり、スクリプトの場所を指定します(my_script.pyは有効なPythonスクリプトの完全なパスです)。

     %emcli @my_script.py

対話モードでのEM CLIの開始:

次のように、コマンド・プロンプトでemcliと入力して、対話型シェルを開始します。

Linuxプラットフォーム:

     % emcli
     emcli>

Windowsプラットフォーム:

     C:\Directory> emcli
     emcli>

スクリプト・モードおよび対話モードの比較

スクリプト・モードと対話モードの両方でインタプリタを使用して同じ目的を達成することを示すため、この例ではインストール済EM CLIクライアントの現在のバージョンを出力します。例3-1は、EM CLIのversion() Verbを使用して現在のバージョンを出力するPythonスクリプトを示します。例3-2は、同じ結果を対話型のシェルを使用して実現しています。両方の例に使用されているversion Verbが同じシグネチャと機能であることに注意してください。

例3-1 現在のバージョンを出力するスクリプト

次の内容のemcli_helloworld.pyという名前のスクリプトの場合:

print 'Hello EMCLI'
print version()

出力結果は次のようになります。

Hello EMCLI
Oracle Enterprise Manager 13c EMCLI Version 13.1

例3-2 現在のバージョンを出力する対話形式での入力

$emcli>print 'Hello EMCLI'
Hello EMCLI
$emcli>version()
Oracle Enterprise Manager 13c EMCLI Version 13.1

3.2.3 対話モード — Oracle Management Server (OMS)への接続

ほとんどのVerbはOMSへの接続を必要とするため、Verbを起動する前に対話型シェルでOMS接続を設定する必要があります。この設定では、次の必須クライアント・プロパティを最低限設定し、他のプロパティをオプションで設定します。

  • EMCLI_OMS_URL

  • EMCLI_TRUSTALLまたはEMCLI_CERT_LOC

これらのプロパティを設定し、その後にログインする場合は、次の手順を使用することをお薦めします。

  1. 利用できるクライアント・プロパティを知りたい場合は、対話型シェルでhelp('client_properties')と入力してください。たとえば、次に示す出力が表示されます。

    emcli>help('client_properties')
    	EMCLI_OMS_URL             : OMS URL To connect to.
    	EMCLI_USERNAME            : OMS Username.
    	EMCLI_AUTOLOGIN           : Possible values are true,false. Default is false.
    	EMCLI_TRUSTALL            : Possible values are true,false. Default is false.
    	EMCLI_VERBJAR_DIR         : Location of bindings directory.
    	EMCLI_CERT_LOC            : Location of a valid certificate file.
    	EMCLI_LOG_LOC             : Directory where log files will be stored.
    	EMCLI_LOG_LEVEL           : Possible values are ALL,INFO,FINE,FINER,WARN,SEVERE
                                     				Default is SEVERE.
    	EMCLI_OUTPUT_TYPE       : Possible values are json, JSON, text, TEXT. Default
                              is 					json in script mode and text in interactive mode.
    
    status() will list values of all the client properties. set_client_property(propertyname,value), get_client_property(propertyname), and
    clear_client_property(name)can be used to set, get, and clear a client property 
    
  2. 必要なクライアント・プロパティを、set_client_property()関数を使用して対話型シェルから直接設定するか、またはシェルを起動する前に環境変数として設定します。

    • 関数方式

      たとえば、https://host1.example.com:1234/emのOMSに接続し、すべての証明書を信頼する場合:

      emcli>set_client_property('EMCLI_OMS_URL',
            'https://host1.example.com:1234/em')
      emcli>set_client_property('EMCLI_TRUSTALL','true')
      
    • 環境変数方式

      たとえば、Linuxプラットフォームで同じクライアント・プロパティを環境変数として設定する場合:

      % setenv EMCLI_TRUSTALL true
      % setenv EMCLI_OMS_URL https://host1.example.com:1234/em
      

      Windowsプラットフォーム:

      C:\Directory> set EMCLI_TRUSTALL=true
      C:\Directory> set EMCLI_OMS_URL=https://host1.example.com:1234/em
      
  3. OMSにログインします。

    emcli>login(username='<user>')
    
  4. プロンプトにパスワードを入力します。または、次の方法を使用してパスワードを入力することもできます。

    emcli>login(username='foo', password='bar')
    

EMCLI_USERNAMEを使用した別のログイン方法

このLinuxプラットフォームでの例に示すとおり、EMCLI_USERNAMEクライアント・プロパティを使用してもログインできます。

% setenv EMCLI_USERNAME sysman
    	emcli>login()
	Enter password :  ******
	
	Login successful

Windowsプラットフォーム:

C:\Directory> set EMCLI_USERNAME sysman
    	emcli>login()
	Enter password :  ******
		
	Login successful

セッションのステータスの表示

status()コマンドを使用することにより、この例に示すとおり、EM CLIセッションのステータスを表示できます。

emcli>status()
    	<banner>
    	
    	Verb Jars Home (EMCLI_VERBJAR_DIR)  : 
                                      /<Location>/int/./bindings/13.2.0.x.0/.emcli
    	EM CLI Home (EMCLI_INSTALL_HOME)        : /<Location>/int/.
    	EM CLI Version                          : 13.2.0.x.0
    	Java Home                               : /jdk6/jre
    	Java Version                            : 1.x.0_x
    	Log file (EMCLI_LOG_LOC)                : CONSOLE
    	Log level (EMCLI_LOG_LEVEL)             : SEVERE
    	EM URL (EMCLI_OMS_URL)                  : https://host1.example.com:1234/em
    	EM user (EMCLI_USERNAME)                : <user>
    	Auto login (EMCLI_AUTOLOGIN)            : false
    	Trust all certificates (EMCLI_TRUSTALL) : true

対話型シェルの終了

EM CLI対話型シェルを終了するには、次に示すとおり、exit Verbを使用します。

emcli>exit()

3.2.4 標準、対話およびスクリプトでVerbを起動する例

この例では、Verbを起動するこれら3つの方式を比較します。

例1 — 文字列ベースの引数

標準起動:

   % emcli create_user -name='jan.doe' -type='EXTERNAL_USER'

対話モードでの起動:

   emcli>create_user(name='jan.doe',type='EXTERNAL_USER')

スクリプト・モードでの起動:

   create_user(name='jan.doe',type='EXTERNAL_USER')

例2 — リストベースの引数

標準起動:

   % emcli grant_privs -name='jan.doe' \
           -privilege="USE_ANY_BEACON" \
           -privilege="FULL_TARGET;TARGET_NAME=host1.example.com:TARGET_TYPE=host"

対話モードでの起動:

   emcli>priv_list = ['USE_ANY_BEACON',
   'FULL_TARGET;TARGET_NAME=myhost.us.example.com:TARGET_TYPE=host']

スクリプト・モードでの起動:

   priv_list=['USE_ANY_BEACON',
   'FULL_TARGET;TARGET_NAME=myhost.us.example.com:TARGET_TYPE=host']

例3 — フラグベースのブール引数

標準起動:

   % emcli get_targets -noheader

対話モードでの起動:

   emcli>get_targets(noheader=True)

スクリプト・モードでの起動:

   get_targets(noheader=True)

対話モードでの不完全なコマンドに関するアドバイザリ情報

対話モードでコマンドを完了しない場合、次行にJythonインタプリタにより3つの点でのプロンプトが表示されます。行が完了するまで、Jythonはこのプロンプトの生成を続けます。たとえば、次のようにします。

emcli > status( 
... 
... 
... 
...)

閉じカッコを入力すると、ステータス・コマンドが実行されます。

この例では、\nによって行は終了し、構文エラーが生成されます。

emcli> get_targets -targets="oracle_database" 
... 
... 
...\n 

3.2.5 初めてのスクリプトの記述と実行

初めてのスクリプトを記述するお手伝いをするため、この項ではすべてのターゲットを取得して名前を出力するスクリプト例を分析します。例3-3にスクリプト全体を示します。

注意:

表3-1での行番号は、説明目的でのみ提供されています。コピー対応のスクリプトは、「サンプル・スクリプト」「例A-1」を参照してください。

注意:

Verb応答get_targets().out()['data']からJSON応答にアクセスしている方法をよく見てください。get_targets()応答は応答オブジェクトにハンドルを提供し、out()['data']は基礎となるJSONデータのハンドルを提供します。この方法論はほとんどのVerbで一貫しています。

スクリプトの分析

表3-1は、コードの各行の分析です。

表3-1 行単位のスクリプト分析

説明

4

すべてのEM CLI Verb関数を現在のプログラムにインポートするためのJythonのimportコンストラクタ。Verb関数を選択的にインポートすることもできます。Jythonのimport関数を使用して、すべての関数をワイルドカードとしてインポートすることも、必要に応じて明示的にインポートすることもできます。たとえば、次のようにします。

     from emcli import * 

前述の例ではすべての関数がインポートされます。

     from emcli import get_targets 

前述の例ではget_targets関数のみがインポートされます。

6 - 10

ターゲットの名前とタイプを出力するカスタムJython関数。次の形式のキーと値のタプルを受け入れます。形式{Target Name, Target Type}のキーと値のタプルをパラメータとして受け入れます。

13, 15

すべてのターゲットを取得するために必要なOMSへの接続。OMSに接続する前に、まず set_client_property()関数を使用してOMS接続の詳細を設定する必要があります。これによりOMS URLがhttps://host1.example.com:1234/emにされ、クライアントがすべての証明書を信頼するようになります。

これらの詳細はディスクに格納されないことに注意してください。これらの詳細はメモリーに格納され、スクリプトが1回実行される間のみ存続します。クライアント・プロパティの詳細については、対話型のシェルからhelp('client_properties')と入力してください。

これらをスクリプトで定義しない場合、EMCLI_OMS_URLおよびEMCLI_TRUSTALL変数を環境変数として指定することもできます。証明書をダウンロード済であれば、環境変数EMCLI_CERT_LOCを使用して証明書のディレクトリを指定することもできます。この場合、EMCLI_TRUSTALLは必要ありません。

18

OMSに接続するためのログイン関数。この例ではSysmanユーザーを使用してログインしています。実行時にパスワードが要求されます。

21 - 24

get_targets()関数を起動し、応答をtargets_arrayという配列に格納します。これはJSON形式になっています。この例ではこの配列内を反復し、カスタム関数print_target_detailsを使用して名前とタイプを出力します。

スクリプトの実行

例3-4は、このスクリプトを実行するとすべてのターゲットのリストとそのタイプが取得されることを示します。

Logout Successfulメッセージは、OMSへのログイン・セッションが、実行の最後に閉じられたことを示しています。

例3-3 すべてのターゲットを取得して名前を出力するスクリプト

 1 #emcli_get_targets.py
 2 
 3 #Import all emcli verbs to current program
 4 from emcli import *
 5 
 6 def print_target_details(target):
 7    '''
	 8    print the target name and target type given a target tuple.
	 9    '''
	10    print target['Target Name'] + ' ' + target['Target Type']
11 
12 #Set the OMS URL to connect to
13 set_client_property('EMCLI_OMS_URL','https://host1.example.com:1234/em')
14 #Accept all the certificates
15 set_client_property('EMCLI_TRUSTALL','true')
16 
17 #Login to the OMS
18 login(username='adminuser')
19 
20 #Invoke get_targets and loop over the targets array
21 targets_array = get_targets().out()['data']
22 for target in targets_array:
23       #Call print_target_details function to print the target details
24     print_target_details(target)

例3-4 すべてのターゲットを取得するスクリプトの出力

$emcli @emcli_get_targets.py
Enter password :  ******
test.example.com host
EM Management Beacon oracle_beacon
CSAcollector oracle_csa_collector
Oemrep_Database oracle_database
EM Jobs Service oracle_em_service
test.example.com:1838 oracle_emd
Management Services and Repository oracle_emrep
Management_Servers oracle_emsvrs_sys
test.example.com:7654_Management_Service oracle_oms
test.example.com:7654_Management_Service_CONSOLE oracle_oms_console
test.example.com:7654_Management_Service_PBS oracle_oms_pbs
/EMGC_EMGC_DOMAIN/EMGC_DOMAIN weblogic_domain
Logout successful

3.2.6 プログラムを介したEM CLI Verbの起動

以前に説明したように、すべてのVerbは、Verbオプションを関数パラメータとするJythonのグローバル関数として使用できます。フラグベースのオプションを指定するには、値にTrueを指定します。リストベースのオプションを指定するには、Pythonリストを構築し、それを配列として使用します。表3-7で、この点の詳細を説明します。

3.2.6.1 Verb起動応答へのアクセス

EM CLI Verbの起動ごとに応答オブジェクトが返されます。応答オブジェクトはEM CLIの一部で、に示す関数があります。

表3-2 応答オブジェクト関数

関数 説明

out()

Verbの実行出力を提供します。出力はテキストかJSONの可能性があり、応答オブジェクトのisJson()メソッドを使用して出力がJSONかどうかを判定できます。詳細は、JSONの処理に関する説明を参照してください。

error()

Verb実行時のエラーテキスト(ある場合)または例外を提供します。詳細は、エラーと例外処理に関する説明を参照してください。

exit_code()

Verb実行の終了コードを提供します。終了コードは、成功した場合は0で、失敗した場合は0以外です。詳細は、エラーと例外処理に関する説明を参照してください。

isJson()

出力のタイプに関する詳細を提供します。response.out()がJSONオブジェクトにパース可能な場合、Trueを返します。

例3-5では、get_targets Verbを起動し、実行時の出力、エラーおよび終了コードを出力します。

注意:

行番号は、説明目的でのみ提供されています。コピー対応のスクリプトは、「サンプル・スクリプト」「例A-2」を参照してください。

行16では、生の応答(JSON)を出力するかわりに、この例ではJythonのlen()関数を使用し、応答関数の長さを出力していることを示します(これは基本的にすべてのターゲットの数と同じになります)。この例ではJythonのstr()関数を使用して整数型を文字列型に変換していることに注意してください。

例3-6は、例3-5のスクリプトを実行したものです。

例3-5 get_targets Verbの関数を組み込んだスクリプト

1  #emcli_introspect_response.py
2  
3  #Import all emcli verbs to current program
4  from emcli import *
5  
6  #Set the OMS URL to connect to
7  set_client_property('EMCLI_OMS_URL','https://host1.example.com:1234/em')
8  #Accept all the certificates
9  set_client_property('EMCLI_TRUSTALL','true')
10 
11 #Login to the OMS
12 login(username='sysman')
13 
14 res = get_targets()
15 
16 print 'Number of targets:'+str(len(res.out()['data']))
17 print 'Errors           :'+res.error()
18 print 'Exit code        :'+str(res.exit_code())
19 print 'IsJson           :'+str(res.isJson())

例3-6 get_targets Verbを起動するスクリプトの出力

$emcli @emcli_introspect_response.py
Enter password :  ******
Number of targets:12
Errors           :
Exit code        :0
IsJson           :True
Logout successful

3.2.6.2 JSON処理

Verbの応答がJSONであれば、対話的に反復してアクセスできます。response.isJson()を使用して、Verbの出力がJSONかどうかを確認できます。Verbの出力がJSONの場合、response.out()['data']はオブジェクトをJythonオブジェクト・モデルの中で提供します。

JSONの処理についてはこれまでの例で示しています。例3-7で、この処理の例をもう1つ示します。この例ではカスタムSQLをlist()関数とともに使用することで、Enterprise Managerの管理対象オブジェクトに関するデータを取得する汎用的なメソッドを提供しています。カスタムSQLは、OMSユーザーにスーパー・ユーザー権限がある場合にのみ機能します。

注意:

表3-3での行番号は、説明目的でのみ提供されています。コピー対応のスクリプトは、「サンプル・スクリプト」「例A-3」を参照してください。

スクリプトの分析

表3-3は、関連するコード行の分析です。プログラムの残りは例3-3と同様で、これは表3-1で分析しています。

表3-3 行単位のスクリプト分析

説明

13 - 22

カスタムJython関数get_targets_with_props()によって、指定したプロパティ名と値を持つすべてのターゲットが返されます。list()関数またはVerbを使用してターゲットを問い合せています。12cR3から登場したこのVerbは、Enterprise Managerリポジトリでリソースを検索する便利な方法です。機能の1つに、指定したSQL問合せに一致するリソースをリストするというものがあり、この例で使用しています。このVerbの出力はJSONで、out()['data']を使用してアクセスできます。

31 - 35

JSON応答を反復してターゲットの名前とタイプを出力します。

スクリプトの実行

例3-8は、このスクリプトを実行するとすべてのターゲットのリストとそのタイプが取得されることを示します。

例3-7 カスタムSQLとlist()関数を組み込んだスクリプト

1  #emcli_json_processing.py
2  #Import all EM CLI verbs to current program
3  from emcli import *
4  def format(str):
5     '''
6     Given a string argument returns it back or returns 
7     a blank string if it is of None type
8     '''
9     if str is None:
10      return ""
11    return str
12 
13 def get_targets_with_props(p_prop_name, p_prop_val):
14 '''
15 Returns targets with given property name and its value. Uses list verb.
16 '''
17 l_sql = "select target_name, target_type, property_value " \
18         "from mgmt$target_properties " \
19         "where property_name = '" + p_prop_name + "' " + "   " \
20         "and property_value like '" + p_prop_val + "'"
21    obj = list(sql=l_sql)                                                                       
22    return obj
23 #Set the OMS URL to connect to
24 set_client_property('EMCLI_OMS_URL','https://host1.example.com:1234/em')
25 #Accept all the certificates
26 set_client_property('EMCLI_TRUSTALL','true')
27 #Log in to the OMS
28 login(username='sysman')
29 #Find all the targets that have Version property set to release 12
30 l_targets = get_targets_with_props('Version', '12%')
31 for target in l_targets.out()['data']:
32       tn =  target['TARGET_NAME']
33       tt =  target['TARGET_TYPE']
34       pv =  target['PROPERTY_VALUE']
35       print "Name "+tn + " Type =" + tt + " value=" + pv

例3-8 カスタムSQLを組み込んだスクリプトの出力

$emcli @emcli_json_processing.py
Enter password :  ******
Name test.example.com:1838 Type =oracle_emd value=13.1.0.0.0
Logout successful

3.2.7 エラー例外処理

Verbの実行時に例外またはエラーが発生した場合、タイプemcli.exception.VerbExecutionErrorの例外が発生します。emcli.exception.VerbExecutionErrorはRuntimeErrorから発展するため、実行が停止します。この例外は、標準のJython例外処理を使用して検出できます。

emcli.exception.VerbExecutionErrorには、表3-4に示す関数があります。

表3-4 emcli.exception.VerbExecutionErrorの関数

関数 説明

error()

Verb実行のエラー・テキストを提供します。

exit_code()

Verb実行の終了コードを提供します。

例3-9に、VerbExecutionErrorの使用方法を示します。

注意:

表3-5での行番号は、説明目的でのみ提供されています。コピー対応のスクリプトは、「サンプル・スクリプト」「例A-4」を参照してください。

スクリプトの分析

表3-5は、関連するコード行の分析です。

表3-5 行単位のスクリプト分析

説明

4, 6

すべてのEM CLI Verbをインポートし、VerbExecutionErrorをインポートします。

9, 11

すべてのターゲットを取得するために必要なOMSへの接続。OMSに接続する前に、まずset_client_property()関数を使用してOMS接続の詳細を設定する必要があります。これによりOMS URLがhttps://host1.example.com:1234/emにされ、クライアントがすべての証明書を信頼するようになります。

これらの詳細はディスクに格納されないことに注意してください。これらの詳細はメモリーに格納され、スクリプトが1回実行される間のみ存続します。クライアント・プロパティの詳細については、対話型のシェルからhelp('client_properties')と入力してください。

これらをスクリプトで定義しない場合、EMCLI_OMS_URLおよびEMCLI_TRUSTALL変数を環境変数として指定することもできます。証明書をダウンロード済であれば、環境変数EMCLI_CERT_LOCを使用して証明書のディレクトリを指定することもできます。この場合、EMCLI_TRUSTALLは必要ありません。

14

OMSに接続するためのログイン関数。この例ではsysmanユーザーを使用してログインしています。実行時にパスワードが要求されます。

22 - 27

同じグループをもう一度作成する例外ユースケース。これにより実行時エラーが発生しますが、この例ではtry exceptブロックで処理しています。

スクリプトの実行

例3-10に、例3-9に示したスクリプトの出力結果を示します。

例3-9 例外処理を組み込んだスクリプト

1  #emcli_error_exception_handling.py
2   
3  #import all emcli verbs to current program
4  from emcli import *
5  #import the verbexecutionerror
6  from emcli.exception import VerbExecutionError
7   
8  #Set the OMS URL to connect to
9  set_client_property('EMCLI_OMS_URL','https://host1.example.com:1234/em')
10 #Accept all the certificates
11 set_client_property('EMCLI_TRUSTALL','true')
12 
13 #Login to the OMS
14 login(username='sysman')
15 
16 #Create a group
17 res = create_group(name='Jan_Doe_Group')
18 
19 print res.out()
20 
21 #Try to create the same group again
22 try:
23   #This will trigger an exception as the group exist already
24   create_group(name='Jan_Doe_Group')
25 except VerbExecutionError , e:
26    print e.error()
27    print 'Exit code:'+str(e.exit_code())

例3-10 エラー例外処理スクリプトの出力

$emcli @emcli_error_exception_handling.py
Enter password :  ******
Group "Jan_Doe_Group:group" created successfully
 
Error: Group "Jan_Doe_Group:group" already exists
 
Exit code:1
Logout successful

3.2.8 ユーティリティ関数

表3-6に示す関数はEM CLIパッケージでも使用できます。

表3-6 その他の関数

関数 説明

last_out()

最後に実行したEM CLIコマンドの出力を返します。現在のセッションでEM CLIコマンドを実行していない場合、Noneを返します。

last_error()

最後に実行したEM CLIコマンドのエラー・テキスト(ある場合)を返します。現在のセッションでEM CLIコマンドを実行していないか、これまでの実行がすべて成功している場合、Noneを返します。

clear()

対話モードで現在のシェルをクリアします。

exit(ret_val)

EM CLI対話型シェルを終了し、戻り値ret_valを返します。

3.2.9 PythonライブラリによるEM CLIの拡張

次のいずれかを実行することで、エンドユーザーのPythonライブラリを使用してEM CLIを拡張できます。

  • この例のように、モジュールを拡張ディレクトリにコピーします。

    $EMCLI_INSTALL_HOME/extdir
    
  • Pythonモジュールの読込み元となるEMCLI_PYTHONPATH環境変数を指定します。

3.2.10 代表的ユースケース

表3-7に、様々なユースケースと、標準のEM CLIと対話型の起動またはスクリプトのそれぞれに対応するソリューション例を示します。

表3-7 ユースケース例

タスクまたはアクション 標準EM CLIでの使用方法 EM CLIインタープリタでの使用方法(対話型シェルまたはスクリプト)

Verbを文字列ベースの引数で起動する

% emcli create_user -name='jane.doe' -type='EXTERNAL_USER'
create_user(name='jane.doe',
type='EXTERNAL_USER')

Verbをリストベースの引数で起動する

% emcli grant_privs -name='jan.doe' -privilege="USE_ANY_BEACON" \
privilege="FULL_TARGET;TARGET_NAME=host1.example.com:TARGET_TYPE=host"
#First construct a list
priv_list = ['USE_ANY_BEACON','FULL_TARGET;TARGET_NAME=host1.example.com: TARGET_TYPE=host']
 
#Now use the list
grant_privs(name='jan.doe',
privilege=priv_list)

Verbをフラグベースのブール引数で起動する

% emcli get_targets -noheader
get_targets(noheader=True)

ヘルプの使用方法

help $verb_name

たとえば、help get_targetsはget_targets Verbのヘルプを出力します。

help(‘$verb_name')

たとえば、help('get_targets')はget_targets Verbのヘルプを出力します。

3.3 拡張スクリプトの例

この章では、EM CLIを使用したスクリプトの書込みおよびルーチン・タスクの自動化の例を示します。これらのスクリプトを使用するには、スクリプト言語を事前に操作し、Jython (JavaプラットフォームのPython)を理解することをお薦めします。

3.3.1 ライフサイクル・ステータス・プロパティの変更

スクリプトを記述するお手伝いをするため、この項ではライフサイクル・ステータス・プロパティを変更するサンプル・スクリプトを分析します。

例3-11を使用すると、Enterprise Manager管理者はテスト環境のすべてのOracleデータベース(リリース11.2)のライフサイクル・ステータスをテストから本番に変更できます。このスクリプトを使用しない場合、Enterprise Manager Cloud Controlコンソールにログインし、すべてのリリース11.2データベースを識別し、ターゲットのホームページから各データベース・ターゲットのプロパティを本番に手動で変更する必要があります。

一連のターゲットを別のライフサイクル・ステータスに変更リクエストがある場合は常に、このスクリプトを再利用できます。

注意:

表3-3での行番号は、説明目的でのみ提供されています。コピー対応のスクリプトは、「サンプル・スクリプト」「例A-5」を参照してください。

例3-11 LifeCyclePropertyChange.py

#Disclaimer
#EXCEPT WHERE EXPRESSLY PROVIDED OTHERWISE, THE SITE, AND ALL CONTENT PROVIDED ON 
#OR THROUGH THE SITE, ARE PROVIDED ON AN "AS IS" AND "AS AVAILABLE" BASIS. ORACLE  
#EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND, WHETHER EXPRESS OR IMPLIED,  
#INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS 
#FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT WITH RESPECT TO THE SITE AND ALL  
#CONTENT PROVIDED ON OR THROUGH THE SITE. ORACLE MAKES NO WARRANTY THAT: (A) THE  
#SITE OR CONTENT WILL MEET YOUR REQUIREMENTS; (B) THE SITE WILL BE AVAILABLE ON AN  
#UNINTERRUPTED, TIMELY, SECURE,OR ERROR-FREE BASIS; (C) THE RESULTS THAT MAY BE 
#OBTAINED FROM THE USE OF THE SITE OR ANY CONTENT PROVIDED ON OR THROUGH THE SITE 
#WILL BE ACCURATE OR RELIABLE; OR (D) THE QUALITY OF ANY CONTENT PURCHASED OR  
#OBTAINED BY YOU ON OR THROUGH THE SITE WILL MEET YOUR EXPECTATIONS.
#ANY CONTENT ACCESSED, DOWNLOADED OR OTHERWISE OBTAINED ON OR THROUGH THE USE OF 
#THE SITE IS USED AT YOUR OWN DISCRETION AND RISK. ORACLE SHALL HAVE NO  
#RESPONSIBILITY FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR LOSS OF DATA THAT 
#RESULTS FROM THE DOWNLOAD OR USE OF CONTENT.
#ORACLE RESERVES THE RIGHT TO MAKE CHANGES OR UPDATES TO, AND MONITOR THE USE OF,  
#THE SITE AND CONTENT PROVIDED ON OR THROUGH THE SITE AT ANY TIME WITHOUT NOTICE.
 1 from emcli import *
 2 
 3 search_list = ['PROPERTY_NAME=\'DBVersion\'','TARGET_TYPE= \'oracle_database\'','PROPERTY_VALUE LIKE \'11.2%\'']
 4 
 5 if len(sys.argv) == 2: 

 6        print login(username=sys.argv[0]) 
 7        l_prop_val_to_set = sys.argv[1] 
 8        l_targets = list(resource="TargetProperties", search=search_list, columns="TARGET_NAME,TARGET_TYPE,PROPERTY_NAME") 
 9        for target in l_targets.out()['data']:
10             t_pn =  'LifeCycle Status' 
11             print "INFO: Setting Property name " + t_pn + " to value " + l_prop_val_to_set
12             print set_target_property_value(property_records=target['TARGET_NAME']+":"+target['TARGET_TYPE']+":"+t_pn+":"+l_prop_val_to_set)
13  else: ]
14        print "\n ERROR: Property value argument is missing" 
15        print "\n INFO: Format to run this file is filename.py <username> <Database Target LifeCycle Status Property Value>"

3.3.1.1 スクリプトの分析

表3-1は、コードの各行の分析です。

表3-8 行単位のスクリプト分析

説明

1

すべてのEM CLI Verb関数を現在のプログラムにインポートするためのJythonのimportコンストラクタ。

3

search_listは、list verbの検索オプションに渡す変数です。この例では、エスケープ文字を使用して一重引用符を表します。list verbの同じオプションの複数の値を渡すには、角カッコで囲んだカンマ区切り値として定義します。

5

ユーザーが2つの引数をスクリプトに指定するif条件を定義します。そうしない場合、スクリプトはエラー・メッセージ(行#15、16で定義)を出力します

6

Enterprise Managerへのログインを提供します。自動ログインのEM CLIを設定している場合、これを削除できます。設定および自動ログインの詳細は、「スクリプト・オプションを使用したEM CLIクライアントのダウンロードとデプロイ」、およびVerbのsetuploginを参照してください。

7

l_prop_val_to_setは変数です。これは設定されるプロパティ値です。このスクリプトがテストから本番にこの値を変更していることに注意してください。この値を受容可能なライフサイクル・プロパティ値に変更できます。有効な値のリストは、modify_lifecycle_stage_name verbまたは『Oracle Enterprise Manager Cloud Control管理者ガイド』を参照してください。

8

l_targetsにlist verbの出力を格納します。list verbで、このスクリプトはTargetPropertiesとしてリソースを渡し、search_list変数として検索します。このスクリプトは次の3つの列を指定します。

  • target_name

  • target_type

  • property_name

9

forループを定義します。l_targetsのデータはJSON形式で使用できます。このループは、list Verbから戻される情報ターゲット・プロパティ情報を反復します。

JSON処理の詳細は、「JSONの処理」を参照してください

10

t_pnをライフサイクル・ステータス値に設定します。

11

スクリプトがライフサイクル・ステータスをコマンドラインからスクリプトに渡された値に設定していることを示す進捗状況メッセージがユーザーに表示されます。

12

property_recordsオプションを使用して値を設定するset_target_property_value verbを定義します。このverbがターゲットのペアに設定される場合、次に移動します。この例は3つのデータベースを示していますが、実際は大きい数のデータベースに対してこのスクリプトを使用します。

13 -15

行#5のif条件と組み合せたElse文。行#5で指定された引数が正しく入力されていない場合、スクリプトは次のエラー・メッセージのいずれかを表示します。

  • プロパティ値の引数が見つかりません

  • このファイルを実行する形式は、filename.py <username> <Database Target LifeCycle Status Property Value>です

3.3.1.2 スクリプト出力

例3-11の実行により、次の出力が示されます。

例3-12 LifeCyclePropertyChange.pyによる出力例

$ emcli @myScript.py user Production

Login successful

INFO: Setting Property name LifeCycle Status to value Production for db1
Properties updated successfully
INFO: Setting Property name LifeCycle Status to value Production for db2
Properties updated successfully
INFO: Setting Property name LifeCycle Status to value Production for db3
Properties updated successfully

Logout successful

3.3.2 データベース・パスワードの変更

スクリプトを記述するお手伝いをするため、この項ではデータベースのパスワードを変更するサンプル・スクリプトを分析します。

セキュリティ・コンプライアンスのために定期的にデータベース・パスワードを再設定する場合は、例3-13が役立ちます。ターゲット・データベースのデータベース・パスワードを変更する場合、そのターゲット・データベースのEnterprise Managerモニタリングを使用できません。一貫したモニタリングを確保するには、Enterprise Manager Cloud Control UIにログインして、必要なデータベース・ターゲットを選択し、非常に時間がかかるデータベースごとのパスワードの変更を行う必要があります。

例3-13を使用して、いくつかのデータベースをグループに追加すると、そのグループ内のすべてのデータベースのパスワードを変更できます。

注意:

表3-9での行番号は、説明目的でのみ提供されています。コピー対応のスクリプトは、「サンプル・スクリプト」「例A-6」を参照してください。

例3-13 dbPasswordChange.py

#Disclaimer
#EXCEPT WHERE EXPRESSLY PROVIDED OTHERWISE, THE SITE, AND ALL CONTENT PROVIDED ON 
#OR THROUGH THE SITE, ARE PROVIDED ON AN "AS IS" AND "AS AVAILABLE" BASIS. ORACLE  
#EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND, WHETHER EXPRESS OR IMPLIED,  
#INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS 
#FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT WITH RESPECT TO THE SITE AND ALL  
#CONTENT PROVIDED ON OR THROUGH THE SITE. ORACLE MAKES NO WARRANTY THAT: (A) THE  
#SITE OR CONTENT WILL MEET YOUR REQUIREMENTS; (B) THE SITE WILL BE AVAILABLE ON AN  
#UNINTERRUPTED, TIMELY, SECURE,OR ERROR-FREE BASIS; (C) THE RESULTS THAT MAY BE 
#OBTAINED FROM THE USE OF THE SITE OR ANY CONTENT PROVIDED ON OR THROUGH THE SITE 
#WILL BE ACCURATE OR RELIABLE; OR (D) THE QUALITY OF ANY CONTENT PURCHASED OR  
#OBTAINED BY YOU ON OR THROUGH THE SITE WILL MEET YOUR EXPECTATIONS.
#ANY CONTENT ACCESSED, DOWNLOADED OR OTHERWISE OBTAINED ON OR THROUGH THE USE OF 
#THE SITE IS USED AT YOUR OWN DISCRETION AND RISK. ORACLE SHALL HAVE NO  
#RESPONSIBILITY FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR LOSS OF DATA THAT 
#RESULTS FROM THE DOWNLOAD OR USE OF CONTENT.
#ORACLE RESERVES THE RIGHT TO MAKE CHANGES OR UPDATES TO, AND MONITOR THE USE OF,  
#THE SITE AND CONTENT PROVIDED ON OR THROUGH THE SITE AT ANY TIME WITHOUT NOTICE.

 1 from emcli  import *
 2 from emcli.exception import VerbExecutionError
 3 import sys
 4 import time
 5 
 6 def check_job_status(job):
 7   count=0
 8   while (count < 10):
 9    count = count + 1
10    obj = emcli.get_jobs(job_id=job)
11    #print obj.out()
12    for entry in obj.out()['data']:
13        l_status = entry['Status ID']
14        l_exec_id = entry['Execution ID']
15        #print entry['Status ID']
16        if (l_status == '5'):
17            print "Job completed successfully"
18            count=100
19        elif (l_status == '4'):
20            l_resp = get_job_execution_detail(execution=l_exec_id, showOutput=True, xml=True)
21            print "Job failed, error details "
22            print "Output " + str(l_resp.out())
23            count=100
24        else:
25            time.sleep(2)
26 
27 def update_db_pwd_for_target(p_target_name, p_target_type, p_old_password, p_new_password):
28    l_target_name = p_target_name
29    l_target_type = p_target_type
30    print "Changing the password for member : name = " + l_target_name + " type = " + l_target_type
31    try :
32        l_resp = update_db_password (target_name=l_target_name,
33                                  target_type = l_target_type,
34                                  change_at_target="yes",
35                                  user_name="dbsnmp",
36                                  old_password=p_old_password,
37                                  new_password=p_new_password,
38                                  retype_new_password=p_new_password)
39        l_job_submitted = l_resp.out()['JobId']
40        check_job_status(l_job_submitted)
41    except emcli.exception.VerbExecutionError, e:
42        print "ERROR : Change Password failed for name = " + l_target_name + " type = " + l_target_type
43        print "ERROR : " + e.error()
44 
45 def update_db_pwd_for_group(p_group, p_old_password, p_new_password):
46    print "Changing the password for group - " + p_group + " from " + p_old_password + " to " + p_new_password
47    members = get_group_members(name=p_group).out()['data']
48    for member in members:
49        l_target_name = member['Target Name']
50        l_target_type = member['Target Type']
51        update_db_pwd_for_target(l_target_name, l_target_type, p_old_password, p_new_password)
52 
53 
54 #Set the OMS URL to connect to
56 set_client_property('EMCLI_OMS_URL','https://myoms.com/em')
57 #Accept all the certificates
58 set_client_property('EMCLI_TRUSTALL','true')
59 
60 login(username=sys.argv[0])
61 
62 
63 l_grp_name = 'maurGroup'
64 
65 l_group_members = ['db1:oracle_database','db2:oracle_database','db3:rac_database']
66 
67 
68 
69 res = create_group(name = l_grp_name, add_targets = l_group_members)
70  
71 print "Listing members for group " + l_grp_name
72 
73 for member in get_group_members(name=l_grp_name).out()['data']:
74    print member
75 
76 
77 y_n_input = raw_input('Now lets change the password for all the members in this group(y/n)')
78 if y_n_input != 'y':
79  exit(0)
80 
81 l_tgt_username = "dbsnmp"
82 l_old_password = "secret1"
83 l_new_password = "secret2"
84   
85 update_db_pwd_for_group(l_grp_name, l_old_password, l_new_password)

3.3.2.1 スクリプトの分析

表3-9は、コードの各行の分析です。

表3-9 行単位のスクリプト分析

説明

1-2

すべてのEM CLI Verbをインポートし、VerbExecutionErrorをインポートします。

3-4

Jythonライブラリをインポートします。

6-25

スクリプトがl_grp_nameグループの各メンバーのデータベース・パスワードを更新するジョブを定義します。各ジョブが正常に完了した後、エラーが存在しないかぎりまたはすべてのデータベース・パスワードが更新されないかぎり、スクリプトはメッセージをユーザーに表示し、次のジョブを処理する前に2秒待機します。

27-43

l_grp_nameグループの各ターゲット・メンバーのデータベース・パスワードを更新する変数を定義します。スクリプトが正常にデータベース・パスワードを更新すると、次のデータベース・ターゲットのパスワードの更新に進む前に次のメッセージをユーザーに表示します。

メンバーのパスワードの変更: name = database_name type = database_type

45-51

ループを定義してl_grp_nameグループからすべてのメンバーを取得し、行#85で定義されているように各メンバーのパスワードを更新します。スクリプトがこのループの処理を開始すると、次のメッセージがユーザーに表示されます。

グループ - l_grp_namel_old_passwordからl_new_passwordへのパスワードの変更

54-58

すべてのターゲットを取得するために必要なOMSへの接続。OMSに接続する前に、set_client_property()関数を使用してOMS接続の詳細を設定する必要があります。これによりOMS URLがhttps://myoms.com/emにされ、クライアントがすべての証明書を信頼するようになります。

これらの詳細はディスクに格納されないことに注意してください。これらの詳細はメモリーに格納され、スクリプトが1回実行される間のみ存続します。クライアント・プロパティの詳細については、対話型のシェルからhelp('client_properties')と入力してください。

これらをスクリプトで定義しない場合、EMCLI_OMS_URLおよびEMCLI_TRUSTALL変数を環境変数として指定することもできます。証明書をダウンロード済であれば、環境変数EMCLI_CERT_LOCを使用して証明書のディレクトリを指定することもできます。この場合、EMCLI_TRUSTALLは必要ありません。詳細は、「対話モード — Oracle Management Server (OMS)への接続」を参照してください。

60

OMSへのログインを提供します。自動ログインのEM CLIを設定している場合、これを削除できます。設定および自動ログインの詳細は、「スクリプト・オプションを使用したEM CLIクライアントのダウンロードとデプロイ」、およびVerbのsetuploginを参照してください。

63

l_grp_nameはグループ名の変数です

65

l_group_membersはデータベース名およびタイプの配列の変数です。

69

l_group_membersからl_grp_name groupにメンバーを追加します

71-74

スクリプトがメンバーをl_grp_nameグループに追加している場合にメッセージをユーザーに表示します

77-79

スクリプトを続行するかどうかを決定するためにユーザーに対してプロンプトを表示します。ユーザーがnを入力すると、スクリプトが終了します。ユーザーがyを入力すると、スクリプトが続行します。

81

l_tgt_usernameは、データベース所有者のユーザー名の変数です。

82

l_old_passwordは、データベース所有者に関連付けられた既存のパスワードの変数です。

83

l_new_passwordは、データベース所有者に関連付けられた新しいパスワードの変数です。

85

l_grp_nameグループのすべてのメンバーに対して既存のパスワードを新しいパスワードに置き換えます。

3.3.2.2 スクリプト出力

例3-13の実行により、次の出力が示されます。

例3-14 dbPasswordChange.pyによる出力例

$ emcli @myScript.py user 
Enter password : **********

Listing members for group maurGroup
('Target Name': 'aixsdbsi', 'Target Type': 'oracle_database')
('Target Name': 'winsidb1', 'Target Type': 'oracle_database')
('Target Name': 'db10g', 'Target Type': 'rac_database')
('Target Name': 'solcdbone', 'Target Type': 'rac_database')
Now let's change the password for all the members in this group (y/n)y
Changing the password for group - maurGroup from secret1 to secret2
Changing the password for member : name = aixsdbsi type = oracle_database
Job completed successfully
Changing the password for member : name = winsidb1 type = oracle_database
Job completed successfully
Changing the password for member : name = db10g type = rac_database
Job completed successfully
Changing the password for member : name = solcdbone type = rac_database
Job completed successfully

Logout successful

3.3.3 検出されたターゲットの昇格

スクリプトを記述するお手伝いをするため、この項では検出されたOracle Databaseターゲットを昇格するサンプル・スクリプトを分析します。

データベースがUIを使用してインスタンスをリクエストする各ユーザーに追加される企業環境を考慮してください。ほとんどの企業は、データベースの作成、データ・ファイルの追加などのプロセス全体を自動化します。自動化プロセスの一部として、最後にこのスクリプトを追加できます。

例3-15は、データベースを自動的に昇格し、Enterprise Managerでモニターできるようにしています。これにより、Enterprise Manager Cloud Control UIにログインしてデータベースを手動で昇格する必要がなくなります。

注意:

表3-10での行番号は、説明目的でのみ提供されています。コピー対応のスクリプトは、「サンプル・スクリプト」「例A-7」を参照してください。

例3-15 promote_discovered_dbs.py

#Disclaimer
#EXCEPT WHERE EXPRESSLY PROVIDED OTHERWISE, THE SITE, AND ALL CONTENT PROVIDED ON 
#OR THROUGH THE SITE, ARE PROVIDED ON AN "AS IS" AND "AS AVAILABLE" BASIS. ORACLE  
#EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND, WHETHER EXPRESS OR IMPLIED,  
#INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS 
#FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT WITH RESPECT TO THE SITE AND ALL  
#CONTENT PROVIDED ON OR THROUGH THE SITE. ORACLE MAKES NO WARRANTY THAT: (A) THE  
#SITE OR CONTENT WILL MEET YOUR REQUIREMENTS; (B) THE SITE WILL BE AVAILABLE ON AN  
#UNINTERRUPTED, TIMELY, SECURE,OR ERROR-FREE BASIS; (C) THE RESULTS THAT MAY BE 
#OBTAINED FROM THE USE OF THE SITE OR ANY CONTENT PROVIDED ON OR THROUGH THE SITE 
#WILL BE ACCURATE OR RELIABLE; OR (D) THE QUALITY OF ANY CONTENT PURCHASED OR  
#OBTAINED BY YOU ON OR THROUGH THE SITE WILL MEET YOUR EXPECTATIONS.
#ANY CONTENT ACCESSED, DOWNLOADED OR OTHERWISE OBTAINED ON OR THROUGH THE USE OF 
#THE SITE IS USED AT YOUR OWN DISCRETION AND RISK. ORACLE SHALL HAVE NO  
#RESPONSIBILITY FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR LOSS OF DATA THAT 
#RESULTS FROM THE DOWNLOAD OR USE OF CONTENT.
#ORACLE RESERVES THE RIGHT TO MAKE CHANGES OR UPDATES TO, AND MONITOR THE USE OF,  
#THE SITE AND CONTENT PROVIDED ON OR THROUGH THE SITE AT ANY TIME WITHOUT NOTICE.
 
  1 from emcli.exception import VerbExecutionError
  2 import sys
  3  
  4 alltargets=False
  5 targetparms=0
  6 uname=''
  7 pword=''
  8 url=''
  9 monitor_pw=''
 10 
 11 def helpUsage():
 12    print 'Usage: promote_discovered_dbs.py [-help]'   
 13    print '[-all] Add all discovered Single Instance DBs'   
 14    print '[-targets <target1:target2:...] Add only targets listed'   
 15    sys.exit()
 16    
 17 for i in range(len(sys.argv)):
 18    if sys.argv[i] in ("-help"):
 19            helpUsage()   
 20    elif sys.argv[i] in ("-targets"):
 21            if i+1 < len(sys.argv):
 22                    targetparms = sys.argv[i+1]
 23    else:
 24                    print 'Usage: promote_discovered_dbs.py [-help]'
 25                    print '[-all] Add all discovered Single Instance DBs'
 26                    print '[-targets <target1:target2:...] Add only targets listed'
 27                    sys.exit()
 28    	elif sys.argv[i] in ("-url"):
 29            if i+1 < len(sys.argv):
 30                    url = sys.argv[i+1]
 31    	elif sys.argv[i] in ("-username"):
 32            if i+1 < len(sys.argv):
 33                    uname = sys.argv[i+1]
 34    elif sys.argv[i] in ("-password"):      
 35            if i+1 < len(sys.argv):         
 36                    pword = sys.argv[i+1]            
 37    elif sys.argv[i] in ("-monitor_pw"):      
 38            if i+1 < len(sys.argv):          
 39                    monitor_pw = sys.argv[i+1]            
 40    elif sys.argv[i] in ("-all"):      
 41                    alltargets = True         
 42            
 43 # Make sure user did not specify target list and all targets.
 44 if alltargets<>0 and targetparms <>0:         
 45    		print 'Cannot specify target list and all switch'            
 46    print 'Usage: promote_discovered_dbs.py -url <EM URL> -username <username> -password <password> -monitor_pw <password>'       
 47    print '[-all] Add all discovered SI Databses'
 48    print '[-targets <target1:target2:...] Add only list targets'
 49    print '[-help]'
 50    sys.exit()
 51
 52 if len(uname)==0 or len(pword)==0 or len(url)==0:
 53         print 'Missing required arguments (-url, -username, -password)' 
 54         print 'Usage: promote_discovered_dbs.py -url <EM URL> -username <username> -password <password> -monitor_pw <password>'
 55         print '[-all] Add all discovered SI Databses'
 56         print '[-targets <target1:target2:...] Add only list targets'
 57         	print '[-help]'
 58         sys.exit()
 59
 60 # Set Connection properties and logon
 61 set_client_property('EMCLI_OMS_URL',url)
 62 set_client_property('EMCLI_TRUSTALL','true')
 63 login(username=uname,password=pword) 
 64
 65 cred_str = "UserName:dbsnmp;password:" + monitor_pw + ";Role:Normal" 
 66
 67 if targetparms <> 0: 
 68    targetparms = targetparms.replace(":",":oracle_database;")+":oracle_database"
 69    target_array = get_targets(unmanaged=True,properties=True,targets=targetparms).out()['data']
 70 elif alltargets:   
 71    target_array = get_targets(targets="oracle_database",unmanaged=True,properties=True ).out()['data']
 72 else:
 73    	print 'Missing required arguments (-targets or -all)'
 74    helpUsage() 
 75   
 76 if len(target_array) > 0:
 77    for target in target_array:
 78            		print 'Adding target ' + target['Target Name'] + '...',
 79
 80            for host in str.split(target['Host Info'],";"):
 81                if host.split(":")[0] == "host":]
 82                    print host.split(":")[1]
 83            try:
 84                res1 = add_target(type='oracle_database',name=target['Target Name'],host=host.split(":")[1], credentials=cred_str,properties=target['Properties'])
 85                print 'Succeeded'
 86            		except VerbExecutionError, e:
 87                print 'Failed'
 88                print e.error()
 89                print 'Exit code:'+str(e.exit_code())
 90 else:
 91    print 'INFO: There are no targets to be promoted. Please verify the targets in Enterprise Manager webpages.'
 92
 

3.3.3.1 スクリプトの分析

表3-10は、コードの各行の分析です。

表3-10 行単位のスクリプト分析

説明

1

すべてのEM CLI Verbをインポートし、VerbExecutionErrorをインポートします。

2

Jythonライブラリをインポートします。

4-9

変数を設定します。

  • uname: Enterprise Managerにアクセスできるユーザー名

  • pword: ユーザー名に関連付けられているパスワード

  • url: Enterprise ManagerのURL

  • monitor_pw: ターゲットを監視できるパスワード

10

入力引数を定義します。

11-15

引数が無効であるか見つからないスクリプトを実行する場合にユーザーに表示されるメッセージを定義します。

Usage: promote_discovered_dbs.py [-help][-all] Add all discovered Single Instance DBs[-targets <target1:target2:...] Add only targets listed

17-41

入力変数(行4から9で定義)が有効で存在することを確認するForループを定義し、そうでない場合はスクリプトが終了し、行11-15で定義されたメッセージを表示します。

43-50

ユーザーがスクリプトの実行時に-targetsおよび-all引数を指定していないことを確認するIf文を定義します。ユーザーが両方の引数を入力すると、スクリプトが終了し、行11-15で定義されたメッセージを表示します。

52-58

ユーザーがスクリプトの実行時にユーザー名、パスワードおよびEnterprise ManagerのURLを指定していることを確認するIf文を定義します。これらの引数のいずれかが見つからない場合、スクリプトが終了し、行11-15で定義されたメッセージを表示します。

60-62

すべてのターゲットを取得するために必要なOMSへの接続。OMSに接続する前に、set_client_property()関数を使用してOMS接続の詳細を設定する必要があります。これによりOMS URLがhttps://myoms.com/emにされ、クライアントがすべての証明書を信頼するようになります。

これらの詳細はディスクに格納されないことに注意してください。これらの詳細はメモリーに格納され、スクリプトが1回実行される間のみ存続します。クライアント・プロパティの詳細については、対話型のシェルからhelp('client_properties')と入力してください。

これらをスクリプトで定義しない場合、EMCLI_OMS_URLおよびEMCLI_TRUSTALL変数を環境変数として指定することもできます。証明書をダウンロード済であれば、環境変数EMCLI_CERT_LOCを使用して証明書のディレクトリを指定することもできます。この場合、EMCLI_TRUSTALLは必要ありません。詳細は、「対話モード — Oracle Management Server (OMS)への接続」を参照してください。

63

OMSへのログインを提供します。自動ログインのEM CLIを設定している場合、これを削除できます。設定および自動ログインの詳細は、「スクリプト・オプションを使用したEM CLIクライアントのダウンロードとデプロイ」、およびVerbのsetuploginを参照してください。

65

モニタリング対象ターゲットに必要な資格証明文字列の変数を定義します。

67

-targets引数が指定されてターゲットが存在するかどうかを確認するif文を定義します。

68

target_paramsの値を設定します

69

get_targets verbのtargets (ターゲットのリストはtargetparamsによって定義されます)、unmanagedおよびpropertiesパラメータを使用して、target_arrayの値を設定します。最初のターゲットに設定される場合、スクリプトが次のターゲットに移動します。

70-71

get_targets verbのtargets、unmanagedおよびpropertiesパラメータを使用して、スクリプトの実行時に-allオプションが指定される場合にtarget_arrayの値を設定するelse if文を定義します。最初のターゲットに設定される場合、スクリプトが次のターゲットに移動します。

72-74

スクリプトの実行時に-targetsまたは-allオプションが指定されない場合のelse文を定義します。これが発生した場合、スクリプトが終了し、行11-15で定義されたメッセージを表示します。

76-78

配列にデータがあるかどうかを確認し、データがある場合にスクリプトが次のようなメッセージを表示します。

Adding target abchost.us.example.com... host.us.example.com

80-82

ホスト情報からホスト名を抽出します

83-88

add_target verbを使用してターゲットを管理リポジトリに追加し、次のメッセージを表示します。

Succeeded

スクリプトがターゲットを管理リポジトリに追加できなかった場合、次のメッセージが表示されます。

Failed

90

行76で配列にターゲットがない場合、スクリプトが終了し、ユーザーに次のメッセージを表示します。

INFO: There are no targets to be promoted. Please verify the targets in Enterprise Manager webpages.Logout successful

3.3.3.2 スクリプト出力

各種のオプションを指定して例3-15を実行すると、次の出力が示されます。

例3-16 -allオプションを使用したpromote_discovered_dbs.pyの出力

$ emcli @promote_discovered_dbs.py -url https://host.us.example.com:7799/em -username sysman -password welcome1 -monitor_pw welcome1 -all
Adding target sid7458.us.example.com... host.us.example.com
Succeeded
Logout successful

例3-17 -targetsオプションを使用したpromote_discovered_dbs.pyの出力

$ emcli @promote_discovered_dbs.py -url https://host.us.example.com:7799/em -username sysman -password welcome1 -monitor_pw welcome1 -targets sid7458.us.example.com
Adding target sid7458.us.example.com... host.us.example.com
Succeeded
Adding target db1... host.us.example.com
Succeeded
Adding target db2... host.us.example.com
Succeeded
Adding target db3... host.us.example.com
Succeeded
Logout successful

例3-18 -targetsオプションを使用したpromote_discovered_dbs.pyの出力

$ emcli @promote_discovered_dbs.py -url https://host.us.example.com:7799/em -username sysman -password welcome1 -monitor_pw welcome1 -targets db1:db2:db3
Adding target db1... host.us.example.com
Succeeded
Adding target db2... host.us.example.com
Succeeded
Adding target db3... host.us.example.com
Succeeded
Logout successful

例3-19 指定されたターゲットが存在しない場合のpromote_discovered_dbs.pyの出力

$ emcli @promote_discovered_dbs.py -url https://host.us.example.com:7799/em -username sysman -password welcome1 -monitor_pw welcome1 -targets abc
INFO: There are no targets to be promoted. Please verify the targets in Enterprise Manager webpages.
Logout successful

例3-20 ターゲットを昇格に使用できない場合のpromote_discovered_dbs.pyの出力

$ emcli @promote_discovered_dbs.py -url https://host.us.example.com:7799/em -username sysman -password welcome1 -monitor_pw welcome1 -all
INFO: There are no targets to be promoted. Please verify the targets in Enterprise Manager webpages.
Logout successful

例3-21 -allまたは-targetsオプションが見つからない場合のpromote_discovered_dbs.pyの出力

$ emcli @promote_discovered_dbs.py -url https://host.us.example.com:7799/em -username sysman -password welcome1 -monitor_pw welcome1
Missing required arguments (-targets or -all)
Usage: promote_discovered_dbs.py [-help]
[-all] Add all discovered Single Instance DBs
[-targets <target1:target2:...] Add only targets listed
Logout successful

3.4 汎用list Verbの使用

EM CLIはlist、get、show、describeなど多数のリスト用Verbを備えています。これらの選択肢から選択するかわりに、EM CLIでは、様々な種類の問合せとともに実行できる汎用のlist Verbを提供しています。

汎用list Verbには、次の利点があります。

  • RESTful Webサービスによるバックアップ

  • JavaScript Object Notation (JSON)をスクリプト用に生成し、標準出力をコマンドライン用に生成する

  • 独自のカスタムSQLを作成し、リポジトリ・ビューを使用してリポジトリからデータを取得する

3.4.1 list Verbの代表的ユースケース

次の各項では、list Verbを様々な用途に使用する例を示します。

3.4.1.1 登録済リソースのリスト

list Verbは、登録済でリスト可能なリソースの記述をサポートします。

すべての登録済リソース・グループとリソースをリストするには、次のように実行します。

emcli list -help

特定のリソースを記述するには、次のように実行します。

emcli list -resource="<resource_name>" -help

これにより、すべての列のリストと説明が提供されます。

データをリストするには、次のように実行します。

emcli list -resource="<resource_name>"

特定数の列をリストするには、次のように実行します。

emcli list -resource="<resource_name>" -columns="col1,col2"

このコマンドは、指定したリソースのcol1およびcol2列のみをリストします。

3.4.1.2 データの検索

list Verbには検索機能があります。

list Verbを使用して検索するには、次のように実行します。

emcli list -resource="<resource_name>" -search="<column>='<value>'"

複数の検索条件を指定するには、次のように実行します。

emcli list -resource="<resource_name>" -search="<column1> = '<value1>'" -search="<colum2> = '<value2>'"

3.4.1.3 bindパラメータによるリソースの登録

bindオプションを使用してリソースをリストするには、次のように実行します。

emcli list -resource="<resource_name>" -bind="col1 = "'val1'"

これは特定の入力としてbindパラメータを必要とする少数のリソースで必要です。

3.4.1.4 エンドユーザー定義のSQLを使用したリスト

-sqlオプションを使用してユーザー定義のSQLを実行するには、次のように実行します。

emcli list -sql='select * from mgmt$target'

-sqlオプションで指定されるSQLは、Enterprise ManagerユーザーMGMT_VIEWとして実行されます。このユーザーは、SYSMANスキーマでEnterprise Managerにより公開されているMGMT$データベース・ビューに対する読取り専用アクセス権限を持ちます。-sqlオプションにはスーパー管理者権限が必要です。

3.5 登録されたクライアント・ページの使用

「登録されたクライアント」ページでは、すべてのEM CLIクライアントのインストールを示し、使用されていないインストールをクリーン・アップしたり削除できます。

このページの次の特長に注意してください。

  • 登録されたクライアントはスーパー・ユーザーしか参照できません。

  • 既存の登録されたクライアントは、ホスト名とバージョンから検索できます。

3.5.1 ページへのアクセス

「登録されたクライアント」ページにアクセスし、その内容を表示する手順は次のとおりです。

  1. Enterprise Manager Cloud Controlコンソールの「設定」メニューから「コマンドライン・インタフェース」を選択します。

    「コマンドライン・インタフェース」タブが表示されます。次の図は、1つのクライアントが登録されているページです。

    図3-1 登録されたクライアント・エントリ


    クライアント・アーキテクチャ

  2. 表示する列を選択するには、「表示」ドロップダウンから「列」を選択し、「列の管理」を選択します。ポップアップされないようにする列を選択し、「OK」をクリックします。

列定義は次のとおりです。

  • クライアント・ホスト名: EM CLIがインストールされているクライアントのホスト名。

  • クライアント・バージョン: EM CLIクライアントのバージョン。

  • インストールのホーム: EM CLIクライアントがインストールされているディレクトリの完全なパス。

  • インスタンス・ホーム: EM CLIインスタンス・ホームのディレクトリの完全なパス。

  • インストール・タイプ: スタンドアロン、シェルまたはスクリプトが可能。

  • 設定者: EM CLIを設定したOSユーザー。

  • 自動ログイン: 有効または無効。

  • すべての証明書を信頼: 有効または無効。

  • 設定時間: EM CLIが設定された時間。

  • 最終同期時刻: sync Verbの最終実行時間。

  • 最終ログイン時間: 最終ログインの時間。

  • 最終ログイン・ユーザー: 最後にログインしたEnterprise Mangerユーザー。

  • EM URL Enterprise ManagerのURL。

3.5.2 表のエントリの削除

このページの表から削除したエントリは、リポジトリのみから削除され、EM CLIがインストールされているクライアント・ホストからはファイルは削除されません。削除後、削除したエントリがある同じディレクトリからEM CLIを起動した場合、表にエントリは再追加されます。

たとえば、EM CLIがhost.example.comの/u01/dirにインストールされていることを表の行が示しているとします。表からのこの行を削除した場合、このアクションではhost.example.comの/u01/dirからファイルは削除されません。host.example.comにログインし、emcli setupを実行すると、Enterprise Mangerは以前削除したのと同じ行を表に追加するようになります。