Pour que l'environnement de secours reste à jour par rapport à l'environnement principal, utilisez ces scripts afin de cloner l'environnement principal Oracle Enterprise Performance Management Cloud vers l'environnement de secours peu après la fin de la maintenance quotidienne de l'environnement principal.
Ces scripts personnalisés déterminent si la maintenance quotidienne planifiée pour la journée est terminée et clonent ensuite l'environnement.
Script Windows
Créezdailyclone.ps1
en copiant le script PowerShell suivant.
# Clone Environment script # # Update the following parameters # ------------------------------- $users_and_predefined_roles="false" $daily_maintenance_start_time="true" $data_management="true" $app_audit="true" $job_console="true" $stored_snapshots_and_files="false" # ------------------------------- $source_username=$args[0] $source_password=$args[1] $source_url=$args[2] $target_username=$args[3] $target_password=$args[4] $target_url=$args[5] if ($($args.count) -ne 6) { echo "Usage: ./dailyclone.ps1 <SOURCE USERNAME> <SOURCE PASSWORD> <SOURCE URL> <TARGET USERNAME> <TARGET PASSWORD> <TARGET URL>" exit 1 } $amw_time="" function getDailyMaintenanceStartTime { $amwstring=$(epmautomate.bat getDailyMaintenanceStartTime) $elements=$amwstring.split(' ') $amwtime=$elements[0] return $amwtime } function goToSleep ($amw_time){ $current_mdy=Get-Date -AsUTC -UFormat "%m/%d/%Y" $current_date_time=Get-Date -AsUTC -UFormat "%m/%d/%Y %H:%M:%S" $current_epoch=Get-Date -Date $current_date_time -UFormat "%s" $target_date_time=[DateTime]"${current_mdy} ${amw_time}" $target_epoch=Get-Date -Date $target_date_time -UFormat "%s" $sleep_seconds=$target_epoch - $current_epoch # Today's AMW start time has already passed, so add 24 hours to sleep_seconds if ($sleep_seconds -lt 0) { $sleep_seconds=$sleep_seconds + 86400 } $sleep_ts=New-TimeSpan -Seconds ${sleep_seconds} $sleep_hms="${sleep_ts}" -replace '^\d+?\.' echo "Current time is ${current_date_time}. Sleeping for ${sleep_hms}, until daily maintenance start time of ${amw_time}." Start-Sleep -Seconds $sleep_seconds } function deleteArtifactSnapshotIfExists { if (artifactSnapshotExists) { $command_del=$(epmautomate.bat deletefile "Artifact Snapshot") } } function artifactSnapshotExists { $filelist=$(epmautomate.bat listfiles) if ("$filelist".contains("Artifact Snapshot")) { return $true else return $false } } function cloneEnvironment { echo "Checking to see if daily maintenance processing has completed ..." while ($true) { if (artifactSnapshotExists) { echo "Daily maintenance processing has completed ..." break } else { echo "Sleeping for 30 seconds before the next check to see if daily maintenance processing has completed ..." Start-Sleep -Seconds 30 } } echo "Encrypting target password ..." epmautomate.bat encrypt "${target_password}" "oracleKey" "target_password.epw" echo "Cloning environment ..." epmautomate.bat cloneEnvironment "${target_username}" "target_password.epw" "${target_url}" "SnapshotName=Artifact Snapshot" "UsersAndPreDefinedRoles=${users_and_predefined_roles}" "DataManagement=${data_management}" "appAudit=${app_audit}" "jobConsole=${job_console}" "storedSnapshotsAndFiles=${stored_snapshots_and_files}" "dailyMaintenanceStartTime=${daily_maintenance_start_time}" } echo "Beginning clone environment script." echo "Logging into server ..." epmautomate.bat login ${source_username} ${source_password} ${source_url} $amwtime=getDailyMaintenanceStartTime goToSleep ($amwtime) deleteArtifactSnapshotIfExists cloneEnvironment echo "Logging out of server ..." epmautomate.bat logout echo "Clone environment script processing has completed."
Script Linux/UNIX
Créezdailyclone.sh
en copiant le script suivant.
#!/bin/bash # Update the following parameters # ------------------------------- epmautomatescript="LOCATION_EPM_AUTOMATE_EXECUTABLE" javahome="LOCATION_JAVA_HOME" users_and_predefined_roles="false" data_management="true" app_audit="true" job_console="true" stored_snapshots_and_files="false" daily_maintenance_start_time="true" # ------------------------------- source_username="$1" source_password="$2" source_url="$3" target_username="$4" target_password="$5" target_url="$6" export JAVA_HOME=${javahome} if [ "$#" -ne 6 ]; then echo "Usage: ./dailyclone.sh SOURCE_USERNAME SOURCE_PASSWORD SOURCE_URL TARGET_USERNAME TARGET_PASSWORD TARGET_URL" exit 1 fi amw_time="" getDailyMaintenanceStartTime() { amw_time=$(${epmautomatescript} getDailyMaintenanceStartTime | cut -d' ' -f1) } goToSleep() { current_mdy=$(date -u +%m/%d/%Y) current_date_time=$(date -u) current_epoch=$(date +%s) target_epoch=$(date -d "${current_mdy} ${amw_time}" +%s) sleep_seconds=$(($target_epoch - $current_epoch)) # Today's AMW start time has already passed, so add 24 hours to sleep_seconds if [[ ${sleep_seconds} -lt 0 ]] then sleep_seconds=$((sleep_seconds + 86400)) fi sleep_hms=$(date -d@${sleep_seconds} -u +%H:%M:%S) echo "Current time is ${current_date_time}. Sleeping for ${sleep_hms}, until daily maintenance start time of ${amw_time}." sleep $sleep_seconds } deleteArtifactSnapshotIfExists() { found=1 filelist=$(${epmautomatescript} listfiles) if [[ ${filelist} == *"Artifact Snapshot"* ]] then command_del=$(${epmautomatescript} deletefile "Artifact Snapshot") fi } artifactSnapshotExists() { found=1 filelist=$(${epmautomatescript} listfiles) if [[ ${filelist} == *"Artifact Snapshot"* ]] then found=0 else found=1 fi echo ${found} } cloneEnvironment() { local found=1 while true do found=$(artifactSnapshotExists) if [[ ${found} -eq 0 ]] then echo "Daily maintenance processing has completed ..." break else echo "Sleeping for 30 seconds before the next check to see if daily maintenance processing has completed ..." sleep 30 fi done echo "Encrypting target password ..." ${epmautomatescript} encrypt "${target_password}" "oracleKey" "target_password.epw" echo "Cloning environment ..." ${epmautomatescript} cloneEnvironment "${target_username}" "target_password.epw" "${target_url}" "SnapshotName=Artifact Snapshot" "UsersAndPreDefinedRoles=${users_and_predefined_roles}" "DataManagement=${data_management}" "appAudit=${app_audit}" "jobConsole=${job_console}" "storedSnapshotsAndFiles=${stored_snapshots_and_files}" "dailyMaintenanceStartTime=${daily_maintenance_start_time}" } echo "Beginning clone environment script." echo "Logging into server ..." ${epmautomatescript} login ${source_username} ${source_password} ${source_url} getDailyMaintenanceStartTime goToSleep deleteArtifactSnapshotIfExists cloneEnvironment echo "Logging out of server ..." ${epmautomatescript} logout echo "Clone environment script processing has completed."
Script Groovy
Créez le script Groovydailyclone
en copiant le code suivant.
// Clone Environment script // Update the following parameters String source_username="USERNAME" String source_password="PASSWORD!" String source_url="URL OF THE SOURCE ENVIRONMENT" String target_username="USERNAME" String target_password="PASSWORD" String target_url="URL OF THE TARGET ENVIRONMENT" String snapshot_name="Artifact Snapshot" // ------------------------------- // Do not update the following parameters String users_and_predefined_roles="false" String data_management="true" String app_audit="true" String job_console="true" String stored_snapshots_and_files="false" String daily_maintenance_start_time="true" // ------------------------------- def LogMessage(String message) { def date = new Date() def sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss") println('[' + sdf.format(date) + '] ' + message); } def LogOperationStatus(EpmAutomateStatus opstatus) { def returncode = opstatus.getStatus() if (returncode != 0){ LogMessage(opstatus.getOutput()) } LogMessage('return code: ' + returncode) } def getDailyMaintenanceStartTime(EpmAutomate automate) { LogMessage("Operation: getDailyMaintenanceStartTime") EpmAutomateStatus amwtimestatus = automate.execute('getDailyMaintenanceStartTime') LogOperationStatus(amwtimestatus) def amwstring=(amwtimestatus.getOutput()) def elements=amwstring.split(' ') def amwtime=elements[0] return amwtime } def goToSleep(String amw_time){ def date = new Date() def current_mdy = new SimpleDateFormat("MM/dd/yyyy") def current_date_time = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss") float current_epoch = date.getTime() / 1000 def pattern = "MM/dd/yyyy HH:mm:ss" def input = current_mdy.format(date) + " " + amw_time + ":00" def target_date_time = Date.parse(pattern, input) float target_epoch = target_date_time.getTime() / 1000 int sleep_seconds = Math.round(target_epoch - current_epoch) //Today's AMW start time has already passed, so add 24 hours to sleep_seconds if (sleep_seconds < 0) { sleep_seconds = sleep_seconds + 86400 } def sleep_milliseconds = sleep_seconds * 1000 LogMessage("Current time is " + current_date_time.format(date) + ". Sleeping until daily maintenance start time of " + amw_time + ":00.") sleep(sleep_milliseconds) } boolean artifactSnapshotExists(EpmAutomate automate,String snapshot_name) { LogMessage("Operation: listfiles") EpmAutomateStatus listfilesstatus = automate.execute('listfiles') String filelist=(listfilesstatus.getItemsList()) LogOperationStatus(listfilesstatus) if (filelist.contains(snapshot_name)) { return true } else { return false } } def deleteArtifactSnapshotIfExists(EpmAutomate automate,String snapshot_name){ if (artifactSnapshotExists(automate,snapshot_name)) { LogMessage("Operation: deletefile " + snapshot_name) EpmAutomateStatus deletefilestatus = automate.execute('deletefile',snapshot_name) LogOperationStatus(deletefilestatus) } } def waitForDailyMaintenanceToComplete(EpmAutomate automate,String snapshot_name) { LogMessage("Checking to see if daily maintenance processing has completed ...") while (true) { if (artifactSnapshotExists(automate,snapshot_name)) { LogMessage("Daily maintenance processing has completed ...") break } else { LogMessage("Sleeping for 30 seconds before the next check to see if daily maintenance processing has completed ...") sleep(30000) } } } LogMessage("Clone environment script processing beginning ...") EpmAutomate automate = getEpmAutomate() LogMessage("Operation: login " + source_username + " " + source_password + " " + source_url) EpmAutomateStatus status = automate.execute('login',source_username,source_password,source_url) LogOperationStatus(status) String amwtime = getDailyMaintenanceStartTime(automate) goToSleep (amwtime) deleteArtifactSnapshotIfExists(automate,snapshot_name) waitForDailyMaintenanceToComplete(automate,snapshot_name) LogMessage("Operation: encrypt " + target_password + " oracleKey target_password.epw") status = automate.execute('encrypt',target_password,'oracleKey','target_password.epw') LogOperationStatus(status) LogMessage("Operation: cloneEnvironment " + target_username + " target_password.epw " + target_url + " SnapshotName=" + snapshot_name + " UsersAndPreDefinedRoles=" + users_and_predefined_roles + " DataManagement=" + data_management + " appAudit=" + app_audit + " jobConsole=" + job_console + " storedSnapshotsAndFiles=" + stored_snapshots_and_files + " dailyMaintenanceStartTime=" + daily_maintenance_start_time) EpmAutomateStatus cloneenvironmentstatus = automate.execute('cloneEnvironment',target_username,"target_password.epw",target_url,"SnapshotName=" + snapshot_name,"UsersAndPreDefinedRoles=" + users_and_predefined_roles,"DataManagement=" + data_management,"appAudit=" + app_audit,"jobConsole=" + job_console,"storedSnapshotsAndFiles=" + stored_snapshots_and_files,"dailyMaintenanceStartTime=" + daily_maintenance_start_time) LogOperationStatus(cloneenvironmentstatus) LogMessage("Operation: logout ") status = automate.execute('logout') LogOperationStatus(status) LogMessage ("Clone environment script processing has completed.")
Exécution du script
dailyclone.ps1
, dailyclone.sh
ou le script Groovy dailyclone
en copiant un script de l'une des sections précédentes.Mise à jour pour dailyclone.sh
:
epmautomatescript
avec l'emplacement de l'exécutable EPM Automate. Exemple : epmautomatescript="/home/utils/EPMAutomate/bin/epmautomate.sh"
javahome
avec le répertoire dans lequel le JDK utilisé par EPM Automate est installé. Par exemple : "/home/user1/jdk1.8.0_191"
dailyclone.ps1
et dailyclone.sh
:
users_and_predefined_roles
: définissez cette valeur sur true
pour cloner les utilisateurs et leurs affectations de rôle prédéfini (les groupes Contrôle d'accès sont toujours clonés).data_management
: définissez cette valeur sur false
pour ne pas cloner les enregistrements d'intégration des données. Les enregistrements d'intégration des données ne peuvent être clonés que si les environnements source et cible utilisent la même mise à jour mensuelle, ou si l'environnement cible repose sur une mise à jour plus récente que l'environnement source. Par exemple, vous pouvez cloner les enregistrements de gestion des données 22.01 vers un autre environnement 22.01 ou un environnement 22.02 uniquement.
Ignoré pour les environnements Narrative Reporting et Oracle Enterprise Data Management Cloud.
app_audit
: définissez cette valeur sur false
si vous ne souhaitez pas cloner les données d'audit d'application pour les applications Planning, FreeForm et Enterprise Profitability and Cost Management.
Les informations d'audit de Financial Consolidation and Close et Tax Reporting sont toujours clonées.
job_console
: définissez cette valeur sur false
si vous ne voulez pas cloner les données de la console de jobs.stored_snapshots_and_files
: définissez cette valeur sur true
si vous voulez cloner le contenu des dossiers de niveau supérieur dans la boîte de réception et la boîte d'envoi (les sous-dossiers ne sont jamais clonés) de l'environnement source.daily_maintenance_start_time
: définissez cette valeur sur false
si vous ne voulez pas réinitialiser l'heure de début de maintenance de l'environnement cible cloné de sorte qu'elle corresponde à celle de l'environnement source.dailyclone
:
source_username
est le nom d'utilisateur d'un administrateur de service. Le rôle Administrateur de domaine d'identité est requis pour cloner des utilisateurs et des rôles prédéfinis.source_password
est le mot de passe de l'utilisateur identifié par SOURCE_USERNAME
.source_url
est l'URL de l'environnement à cloner.target_username
est le nom d'utilisateur d'un administrateur de service. Le rôle Administrateur de domaine d'identité est requis pour cloner des utilisateurs et des rôles prédéfinis.target_password
est le mot de passe de l'utilisateur identifié par TARGET_USERNAME
.target_URL
est l'URL de l'environnement cible.dailyclone.ps1
, dailyclone.sh
ou le script Groovy dailyclone
:
Windows
dailyclone.ps1
../dailyclone.ps1 SOURCE_USERNAME SOURCE_PASSWORD SOURCE_URL TARGET_USERNAME TARGET_PASSWORD TARGET_URL
. Reportez-vous au tableau suivant pour obtenir une description de ces valeurs.Table 3-7 Description des paramètres
Paramètre | Description |
---|---|
SOURCE_USERNAME |
Nom d'utilisateur d'un administrateur de service. Cet utilisateur doit également disposer du rôle Administrateur de domaine d'identité pour cloner les utilisateurs et les rôles prédéfinis. |
SOURCE_PASSWORD |
Mot de passe de l'utilisateur identifié par SOURCE_USERNAME . |
SOURCE_URL |
URL de l'environnement à cloner. |
TARGET_USERNAME |
Nom d'utilisateur de l'administrateur de service dans l'environnement cible. Cet utilisateur doit également disposer du rôle Administrateur de domaine d'identité pour cloner les utilisateurs et les rôles prédéfinis. |
TARGET_PASSWORD |
Mot de passe de l'utilisateur identifié par TARGET_USERNAME . |
TARGET_URL |
URL de l'environnement cible. |
dailyclone.sh
../dailyclone.sh SOURCE_USERNAME SOURCE_PASSWORD SOURCE_URL TARGET_USERNAME TARGET_PASSWORD TARGET_URL
. Reportez-vous au tableau précédent pour obtenir une description de ces valeurs.Reportez-vous à la section Exécution de commandes sans installer EPM Automate.