4 拡張EM CLIスクリプトの例

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

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

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

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

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

ノート:

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

例4-1 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>"

スクリプトの分析

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

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

説明

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管理者ガイドhttps://docs.oracle.com/pls/topic/lookup?ctx=en/enterprise-manager/cloud-control/enterprise-manager-cloud-control/13.4/emcli&id=EMADM-GUID-E6C3A9BC-AD00-46BA-9CE3-B51338E0AA97を参照してください。

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>です

スクリプト出力

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

例4-2 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

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

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

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

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

ノート:

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

例4-3 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)

スクリプトの分析

表4-2は、コードの各行の分析です。

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

説明

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グループのすべてのメンバーに対して既存のパスワードを新しいパスワードに置き換えます。

スクリプト出力

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

例4-4 Output From 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

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

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

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

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

ノート:

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

例4-5 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
 

スクリプトの分析

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

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

説明

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を使用してターゲットを管理リポジトリに追加し、次のメッセージを表示します。

成功

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

失敗

90

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

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

スクリプト出力

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

例4-6 -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

例4-7 -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

例4-8 -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

例4-9 指定されたターゲットが存在しない場合の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

例4-10 ターゲットを昇格に使用できない場合の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

例4-11 -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