Release 3 of Enterprise Manager gives the command line interface for EM a distinct advantage by moving the EMCLI functionality into Jython, a Java implementation of the Python programming language.
This session will provide an introduction to Python and give attendees a crash course in the newest version of EMCLI so they can get started using this powerful tool in their environments right away.
Learning Objectives:
-- Evaluate where Python can provide solutions in other aspects of the DBA's responsibility including automating password changes and backups.
-- Understand how to implement and use release 3 of EMCLI. Differentiate between the Jython architecture of release 3 versus earlier versions of EMCLI.
-- Have a basic understanding of and be able to construct simple scripts in Python.
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Python and EM CLI: The Enterprise Management Super Tools
1. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.org
Python and EM CLI
The Enterprise Management
Super Tools
2. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.orgWho Am I?
• Oracle ACE
• IOUG Board of Directors
• Oracle University Instructor
• TCOUG Vice President
• RAC Attack! Ninja
• Lives in St. Paul, MN
3. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.orgOverview
• History of Python
• BDFL
• Jython
• JSON
• Python Examples
• EM CLI Examples
4. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.orgHistory
• Created by Guido Van Rossum
• Influenced by ABC
• Released in 1991
• Named after Monty Python’s
Flying Circus
5. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.orgBenevolent Dictator for Life (BDFL)
6. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.org
Scripting or Programming
• Both!
• Programming
languages must be
compiled
• Compiled at runtime
7. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.orgJython
• Python written in Java
• Released in 1997 as JPython
• Replaced “C” implementation of
Python
• EM CLI and WLST
• No Java Experience Required
8. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.orgJSON
• JavaScript Object Notation
• Data Interchange Standard
• A collection of name/value pairs
• Universal
• Python object
9. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.orgGetting Started
• Built for Ease-of-Use
• Indentation Format
• Interactive Interface
for VAR in myLoop:
do this command
print('This line does not
belong in myLoop')
34. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.org
>>> for a, b in mydict.items():
print('Key: ' + a + 'nValue: ' +
b + 'n')
Dictionaries (Hashes)
Target Properties
46. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.orgTEXT Mode
emcli>get_targets()
Status Status Target Type Target Name
ID
4 Agent Unreachab host em12cr3.example.com
le
47. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.orgTEXT Mode
emcli>linenum = 0
emcli>for i in get_targets().out().splitlines()[0:4]:
linenum += 1
print('Linenum ' + str(linenum) + ': ' + i)
Linenum 1: Status Status Target Type Target Name
Linenum 2: ID
Linenum 3: 4 Agent Unreachab host em12cr3.example.com
Linenum 4: le
48. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.orgTEXT Mode
emcli>set_client_property('EMCLI_OUTPUT_TYPE', 'TEXT')
emcli>str(get_client_property('EMCLI_OUTPUT_TYPE'))
'TEXT'
emcli>get_targets().isJson()
False
emcli>type(get_targets().out())
<type 'unicode'>
emcli>type(get_targets().out().splitlines())
<type 'list'>
emcli>get_targets()
Status Status Target Type Target Name
ID
4 Agent Unreachab host em12cr3.example.com
le
emcli>linenum = 0
emcli>for i in get_targets().out().splitlines()[0:4]:
linenum += 1
print('Linenum ' + str(linenum) + ': ' + i)
Linenum 1: Status Status Target Type Target Name
Linenum 2: ID
Linenum 3: 4 Agent Unreachab host em12cr3.example.com
Linenum 4: le
63. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.orgUpdate Properties
emcli>for targ in mytargs:
if targ['TARGET_TYPE'] ==
'oracle_database' and 'em12cr3'
in targ['TARGET_NAME']:
print(targ['TARGET_NAME'])
orcl_em12cr3.example.com
64. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.orgUpdate Properties
emcli>for targ in mytargs:
if 'oracle_database' in
targ['TARGET_TYPE'] and
'em12cr3' in targ['TARGET_NAME']:
72. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.orgQuery Target Properties
emcli>for i in mytargprops:
if i['TARGET_TYPE'] ==
'oracle_database' and
i['TARGET_NAME'] ==
'orcl_em12cr3.example.com' and
'orcl_gtp' in i['PROPERTY_NAME']:
print([i['PROPERTY_NAME‘
], i['PROPERTY_VALUE']])
95. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.orgClasses
for __inttarg in self.targs:
for __propkey, __propvalue in props.items():
96. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.orgClasses
for __inttarg in self.targs:
for __propkey, __propvalue in props.items():
__property_records =
__inttarg['TARGET_NAME'] +
__delim + __inttarg['TARGET_TYPE'] +
__delim + __propkey + __delim +
__propvalue
97. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.orgClasses
for __inttarg in self.targs:
for __propkey, __propvalue in props.items():
print('Target: ' +
__inttarg['TARGET_NAME'] +
' (' + __inttarg['TARGET_TYPE'] +
')ntProperty: ' +__propkey +
'ntValue: ' + __propvalue + 'n')
98. #C14LV #EM12c #EMCLI #Python
@Seth_M_Miller
SethMiller.SM@gmail.com
http://sethmiller.orgClasses
for __inttarg in self.targs:
for __propkey, __propvalue in props.items():
emcli.set_target_property_value(
subseparator=__subseparator,
property_records=__property_records)