使用本節中的指令碼來建立自助解決方案,以維護您 Oracle Enterprise Performance Management Cloud 環境的最新快照文件庫。您需要一個專用於升級和維護最新快照程式庫的環境。
EPM Cloud 僅支援一個月週期的快照相容性;您可以將維護快照從測試環境移轉至生產環境,反之亦然。但是,某些客戶的稽核要求可能需要在最近的環境中還原多年的快照,並在短時間內存取應用程式。
您應該將此指令碼排定為每個月執行一次,以轉換可用的快照並使其與最新的EPM Cloud 修補程式層級相容。Oracle 建議您在每個月的第三個星期五之後執行該指令碼,以確保生產環境中的所有問題皆已解決。
註:
您無法使用此指令碼來更新 Narrative Reporting、Account Reconciliation 及 Oracle Enterprise Data Management Cloud 快照。
指令碼的運作方式
對於客戶儲存的每個快照,使用 EPM Automate 升級指令碼完成下列任務:input.properties
檔案中的資訊,登入環境recreate
命令以翻新環境Artifact Snapshot
(維護快照) 下載到資料夾。如果藉由從 snapshots/18.05
上傳快照來重新建立 18.05 環境,則 Artifact Snapshot
會下載至 snapshots/18.06
。執行指令碼
input.properties
檔案,並使用環境資訊對其進行更新。將檔案儲存在本機目錄中。這個目錄在此探討中稱為 parentsnapshotdirectory
。此檔案的內容因作業系統而異。
確保您在此目錄中具有寫入權限。至於 Windows,您可能需要使用以管理員身分執行選項來啟動 PowerShell,才能執行指令碼。
upgradeSnapshots.ps1
(Windows PowerShell) 或 upgradeSnapshots.sh
(Linux/UNIX) 指令碼,並將其儲存在 input.properties
所在的 parentsnapshotdirectory
中。snapshots
,位於 parentsnapshotdirectory
中。snapshots
) 中,為要轉換的每月快照建立一個子目錄,使其與目前的 EPM Cloud 修補程式層級相容。使用 YY.MM
格式來命名目錄;例如,18.05
的目錄可儲存 2018 年 5 月的快照。snapshots/18.05
。./upgradeSnapshots.sh
。upgradeSnapshots.ps1
。Windows
複製本節中的指令碼,以建立 input.properties
和 upgradeSnapshots.ps1
指令碼。
建立 input.properties
username=exampleAdmin userpassword=examplePassword serviceurl=exapleURL proxyserverusername=proxyServerUserName proxyserverpassword=proxyPassword proxyserverdomain=proxyDoamin parentsnapshotdirectory=C:/some_directory/snapshots emailtoaddress=exampleAdmin@oracle.com
更新 input.properties
註:
如果未對 Windows 網路環境啟用 authentication at proxy server
,請將特性 proxyserverusername
、proxyserverpassword
以及 proxyserverdomain
從 input.properties
檔案中移除。
表格 3-8 input.properties 參數
Parameter | Description |
---|---|
username |
服務管理員。的使用者名稱 |
userpassword |
服務管理員的密碼。 |
serviceurl |
用於此活動之環境的 URL。 |
proxyserverusername |
用於驗證代理伺服器 (控制網際網路存取) 之安全階段作業的使用者名稱。 |
proxyserverpassword |
使用代理伺服器驗證使用者的密碼。 |
proxyserverdomain |
為代理伺服器定義的網域名稱。 |
parentsnapshotdirectory |
目錄的絕對路徑,該目錄用來作為儲存要處理之快照的目錄的父目錄。使用正斜線 (/) 作為目錄分隔符號。 |
emailtoaddress |
(選擇性) 要傳送重新建立舊環境結果的目標電子郵件地址。只有指定這個值之後,才能透過電子郵件傳送結果。
範例: |
註:
如果密碼包含特殊字元,請參閱處理特殊字元。
建立 upgradeSnapshots.ps1
使用此範例指令碼以建立 upgradeSnapshots.ps1
# Script for recreating an old EPM Cloud environment # read in key/value pairs from input.properties file $inputproperties=ConvertFrom-StringData(Get-Content ./input.properties -raw) # Global variables $parentsnapshotdirectory="$($inputproperties.parentsnapshotdirectory)" $username="$($inputproperties.username)" $userpassword="$($inputproperties.userpassword)" $serviceurl="$($inputproperties.serviceurl)" $proxyserverusername="$($inputproperties.proxyserverusername)" $proxyserverpassword="$($inputproperties.proxyserverpassword)" $proxyserverdomain="$($inputproperties.proxyserverdomain)" $emailtoaddress="$($inputproperties.emailtoaddress)" $operationmessage="EPM Automate operation:" $operationfailuremessage="EPM Automate operation failed:" $operationsuccessmessage="EPM Automate operation completed successfully:" $epmautomatescript="epmautomate.bat" $workingdir="$pwd" $logdir="$workingdir/logs/" $logfile="$logdir/epmautomate-upgradesnapshots.log" function LogMessage { $message=$args[0] $_mydate=$(get-date -f dd_MM_yy_HH_mm_ss) echo "[$_mydate] $message" >> $logfile } function LogAndEchoMessage { $message=$args[0] $_mydate=$(get-date -f dd_MM_yy_HH_mm_ss) echo "[$_mydate] $message" | Tee-Object -Append -FilePath $logfile } function LogOutput { $_mydate=$(get-date -f dd_MM_yy_HH_mm_ss) $op=$args[0] $opoutput=$args[1] $returncode=$args[2] #If error if ($returncode -ne 0) { $failmessage="[$_mydate] $operationfailuremessage $op" LogMessage $failmessage LogMessage $opoutput LogMessage "return code: $returncode" } else { $successmessage="[$_mydate] $operationsuccessmessage $op" LogMessage $successmessage LogMessage $opoutput LogMessage "return code: $returncode" } } function ExecuteCommand { $op=$args[0] $epmautomatecall="$epmautomatescript $op" $date=$(get-date -f dd_MM_yy_HH_mm_ss) LogMessage "$operationmessage $epmautomatecall" $operationoutput=iex "& $epmautomatecall" >> $logfile 2>&1 LogOutput $op $operationoutput $LastExitCode } function ProcessCommand { $command=$args[0] $date=$(get-date -f dd_MM_yy_HH_mm_ss) if (!([string]::IsNullOrWhitespace($command))) { if (!($command.StartsWith("#"))) { ExecuteCommand $command } } } function Init { $logdirexists=Test-Path $logdir if (!($logdirexists)) { mkdir $logdir 2>&1 | out-null } # removing existing epmautomate debug logs rm ./*.log $logfileexists=Test-Path $logfile # remove existing log file if ($logfileexists) { rm $logfile } } function GetNextDate { $latestyearmonth=$args[0] LogMessage "latest year.month: $latestyearmonth" $latestyear,$latestmonth=$latestyearmonth.split('\.') LogMessage "latest year: $latestyear" LogMessage "latest month: $latestmonth" $intlatestyear=[int]$latestyear $intlatestmonth=[int]$latestmonth if ($intlatestmonth -eq 12) { $intnextmonth=1 $intnextyear=$intlatestyear+1 } else { $intnextmonth=$intlatestmonth+1 $intnextyear=$intlatestyear } $nextyear="{0:D2}" -f $intnextyear $nextmonth="{0:D2}" -f $intnextmonth echo "$nextyear.$nextmonth" } function ProcessSnapshot { $snapshotfile=$args[0] LogMessage "snapshotfile: $snapshotfile" $nextdate=$args[1] LogMessage "nextdate: $nextdate" $snapshotfilename=$snapshotfile.split('/')[-1] LogMessage "snapshotfilename: $snapshotfilename" $snapshotname=$snapshotfilename.split('.')[0] LogMessage "snapshotname: $snapshotname" ProcessCommand "login $username $userpassword $serviceurl $proxyserverusername $proxyserverpassword $proxyserverdomain" ProcessCommand "recreate -f" ProcessCommand "uploadfile $snapshotfile" ProcessCommand "importsnapshot $snapshotname" ProcessCommand "runDailyMaintenance skipNext=true -f" ProcessCommand "downloadfile 'Artifact Snapshot'" ProcessCommand "deletefile $snapshotname" ProcessCommand "logout" $nextdatedirexists=Test-Path $parentsnapshotdirectory/$nextdate if (!($nextdatedirexists)) { mkdir $parentsnapshotdirectory/$nextdate 2>&1 | out-null } LogMessage "Renaming 'Artifact Snapshot.zip' to $snapshotname.zip and moving to $parentsnapshotdirectory/$nextdate" mv $workingdir/'Artifact Snapshot.zip' $workingdir/$snapshotname.zip >> $logfile 2>&1 mv $workingdir/$snapshotname.zip $parentsnapshotdirectory/$nextdate >> $logfile 2>&1 } function callSendMail { $logfile=$logfile -replace "\\", "/" $elements=$logfile.split('/') $logfilename=$elements[-1] if (${emailtoaddress} -match "@") { epmautomate.bat login ${username} ${userpassword} ${serviceurl} epmautomate.bat uploadFile "$logfile" epmautomate.bat sendMail $emailtoaddress "Recreating An Old EPM Cloud Environment results" Body="The results of recreating an old EPM Cloud Environment are attached." Attachments=$logfilename epmautomate.bat deleteFile "$logfilename" epmautomate.bat logout } } #----- main body of processing date Init LogAndEchoMessage "Starting upgrade snapshots processing" $snapshotdirs=@(Get-ChildItem -Directory "$parentsnapshotdirectory" -name) LogMessage "snapshot directories: $snapshotdirs" $latestreleasedate=$snapshotdirs[-1] LogMessage "latest release date: $latestreleasedate" $latestreleasesnapshotdir="$parentsnapshotdirectory/$latestreleasedate" LogMessage "latest release snapshot dir: $latestreleasesnapshotdir" $nextdate=$(GetNextDate "$latestreleasedate") $snapshotfiles=@(Get-ChildItem -File "$latestreleasesnapshotdir") if ($snapshotfiles.length -eq 0) { LogAndEchoMessage "No snapshot files found in directory $latestreleasesnapshotdir. Exiting script." exit } foreach ($snapshotfile in $snapshotfiles) { LogAndEchoMessage "Processing snapshotfile: $snapshotfile" ProcessSnapshot $latestreleasesnapshotdir/$snapshotfile $nextdate } LogAndEchoMessage "Upgrade snapshots processing completed" date callSendMail
Linux/UNIX
複製下列指令碼以建立 upgradeSnapshots.sh
和 input.properties
。
為 Linux/UNIX 建立 input.properties
註:
如果您的網路未設定為使用代理伺服器以存取網際網路,請將特性 proxyserverusername
、proxyserverpassword
以及 proxyserverdomain
從 input.properties
檔案移除。
username=exampleAdmin userpassword=examplePassword serviceurl=exapleURL proxyserverusername= proxyserverpassword= proxyserverdomain= jdkdir=/home/user1/jdk160_35 epmautomatescript=/home/exampleAdmin/epmautomate/bin/epmautomate.sh parentsnapshotdirectory=/home/exampleAdmin/some_directory/snapshots emailtoaddress=exampleAdmin@oracle.com
更新 input.properties
表格 3-9 input.properties 參數
Parameter | Description |
---|---|
username |
服務管理員。的使用者名稱 |
userpassword |
服務管理員的密碼。 |
serviceurl |
用於此活動之環境的 URL。 |
proxyserverusername |
用於驗證代理伺服器 (控制網際網路存取) 之安全階段作業的使用者名稱。 |
proxyserverpassword |
使用代理伺服器驗證使用者的密碼。 |
proxyserverdomain |
為代理伺服器定義的網域名稱。 |
jdkdir |
JAVA_HOME 位置。 |
epmautomatescript |
EPM Automate 執行檔 (epmautomate.sh ) 的絕對路徑。 |
parentsnapshotdirectory |
目錄的絕對路徑,該目錄用來作為儲存要處理之快照的目錄的父目錄。 |
emailtoaddress |
(選擇性) 要傳送重新建立舊環境結果的目標電子郵件地址。 |
註:
如果密碼包含特殊字元,請參閱處理特殊字元。
建立 upgradeSnapshots.sh
使用此範例指令碼以建立 upgradeSnapshots.sh
#!/bin/sh . ./input.properties workingdir=$(pwd) logdir="${workingdir}/logs" logfile=epmautomate-upgradesnapshots.log operationmessage="EPM Automate operation:" operationfailuremessage="EPM Automate operation failed:" operationsuccessmessage="EPM Automate operation completed successfully:" logdebugmessages=true if [ ! -d ${jdkdir} ] then echo "Could not locate JDK/JRE. Please set value for "jdkdir" property in input.properties file to a valid JDK/JRE location." exit fi if [ ! -f ${epmautomatescript} ] then echo "Could not locate EPM Automate script. Please set value for "epmautomatescript" property in the input.properties file." exit fi export JAVA_HOME=${jdkdir} debugmessage() { # logdebugmessages is defined (or not) in testbase input.properties if [ "${logdebugmessages}" = "true" ] then logmessage "$1" fi } logmessage() { local message=$1 local _mydate=$(date) echo "[$_mydate] ${message}" >> "$logdir/$logfile" } echoandlogmessage() { local message=$1 local _mydate=$(date) echo "[$_mydate] ${message}" | tee -a ${logdir}/${logfile} } logoutput() { date=`date` op="$1" opoutput="$2" returncode="$3" #If error #if grep -q "EPMAT-" <<< "$2" if [ $returncode -ne 0 ] then failmessage="[${date}] ${operationfailuremessage} ${op}" logmessage "${failmessage}" logmessage "${opoutput}" logmessage "return code: ${returncode}" else successmessage="${operationsuccessmessage} ${op}" logmessage "${successmessage}" logmessage "${opoutput}" logmessage "return code: ${returncode}" fi } getLatestReleaseSnapshotDir() { local snapshotdirs=$(find ${parentsnapshotdirectory} -type d | sort) debugmessage "snapshot directories: ${snapshotdirs}" local latestreleasesnapshotdir=$(echo ${snapshotdirs##*$\n} | rev | cut -d' ' -f1 | rev) debugmessage "latest release snapshot dir: ${latestreleasesnapshotdir}" echo "${latestreleasesnapshotdir}" } getNextDate() { local thisyearmonth=$1 local thisyear=$(echo ${thisyearmonth} | cut -d'.' -f1) local thismonth=$(echo ${thisyearmonth} | cut -d'.' -f2) intthismonth=$(bc <<< ${thismonth}) intthisyear=$(bc <<< ${thisyear}) if [ ${intthismonth} -eq 12 ] then local intnextmonth=1 local intnextyear=$((intthisyear+1)) else local intnextmonth=$((intthismonth+1)) local intnextyear=${intthisyear} fi nextmonth=$(printf "%02d\n" ${intnextmonth}) nextyear=$(printf "%02d\n" ${intnextyear}) debugmessage "next date: ${nextyear}.${nextmonth}" echo "${nextyear}.${nextmonth}" } init() { if [ ! -d "$logdir" ] then mkdir $logdir fi # removing existing epmautomate debug logs if ls ./*.log >/dev/null 2>&1 then rm ./*.log fi # remove existing log files if [ -f "${logdir}/${logfile}" ] then rm ${logdir}/${logfile} fi } processCommand() { op="$1" date=`date` logmessage "$operationmessage $op" operationoutput=`eval "$epmautomatescript $op"` logoutput "$op" "$operationoutput" "$?" } processSnapshot() { local snapshotfile="$1" local nextdate="$2" local snapshotname=$(echo "${snapshotfile}" | rev | cut -d'/' -f1 | rev | cut -d'.' -f1) processCommand "login ${username} ${userpassword} ${serviceurl} ${proxyserverusername} ${proxyserverpassword}" processCommand "recreate -f" processCommand "uploadfile ${snapshotfile}" processCommand "importsnapshot \"${snapshotname}\"" processCommand "runDailyMaintenance skipNext=true -f" processCommand "downloadfile \"Artifact Snapshot\"" processCommand "deletefile \"${snapshotname}\"" processCommand "logout" if [ ! -d ${parentsnapshotdirectory}/${nextdate} ] then mkdir ${parentsnapshotdirectory}/${nextdate} fi runDailyMaintenance -f logmessage "Renaming \"Artifact Snapshot.zip\" to ${snapshotname}.zip and moving to ${parentsnapshotdirectory}/${nextdate}" mv "${workingdir}/Artifact Snapshot.zip" "${workingdir}/${snapshotname}.zip" >> "$logdir/$logfile" 2>&1 mv "${workingdir}/${snapshotname}.zip" ${parentsnapshotdirectory}/${nextdate} >> "$logdir/$logfile" 2>&1 } callSendMail() { if [[ "${emailtoaddress}" == *"@"* ]] then ${epmautomatescript} login ${username} ${userpassword} ${serviceurl} ${epmautomatescript} uploadFile "$logdir/$logfile" ${epmautomatescript} sendMail $emailtoaddress "Recreating An Old EPM Cloud Environment results" Body="The results of recreating an old EPM Cloud Environment are attached" Attachments=$logfile ${epmautomatescript} deleteFile "$logfile" ${epmautomatescript} logout fi } #----- main body of processing date echoandlogmessage "Starting upgrade snapshots processing" init latestreleasesnapshotdir=$(getLatestReleaseSnapshotDir) latestreleasedate=$(echo "${latestreleasesnapshotdir}" | rev | cut -d'/' -f1 | rev) debugmessage "latest release date: ${latestreleasedate}" nextdate=$(getNextDate ${latestreleasedate}) snapshotfiles=$(find ${latestreleasesnapshotdir} -type f -name \*.zip | tr "\n" "|") if [ ${#snapshotfiles} -eq 0 ] then echoandlogmessage "No snapshot files found in directory ${latestreleasesnapshotdir}" fi IFS="|" for snapshotfile in $snapshotfiles do echoandlogmessage "Processing snapshotfile: ${snapshotfile}" processSnapshot ${snapshotfile} ${nextdate} done unset IFS echoandlogmessage "Upgrade snapshots processing completed." callSendMail