Täglich nach Abschluss der täglichen Wartung der Primärumgebung die Primärumgebung auf die Standbyumgebung klonen

Um die Standbyumgebung mit der Primärumgebung auf dem neuesten Stand zu halten, verwenden Sie diese Skripte zum Klonen der Primärumgebung von Oracle Enterprise Performance Management Cloud auf die Standbyumgebung, sobald die tägliche Wartung der Primärumgebung abgeschlossen ist.

Diese benutzerdefinierten Skripte ermitteln, ob die geplante tägliche Wartung für den Tag abgeschlossen ist, und klonen dann die Umgebung.

Windows-Skript

Erstellen Sie dailyclone.ps1, indem Sie das folgende PowerShell-Skript kopieren.
# 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."

Linux-/UNIX-Skript

Erstellen Sie dailyclone.sh, indem Sie das folgende Skript kopieren.
#!/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."

Groovy-Skript

Erstellen Sie das Groovy-Skript dailyclone, indem Sie den folgenden Code kopieren.
// 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.")

Skripte ausführen

  1. Erstellen Sie dailyclone.ps1, dailyclone.sh oder das Groovy-Skript dailyclone, indem Sie ein Skript aus einem der vorherigen Abschnitte kopieren.
  2. Aktualisieren Sie die Skripte:

    Update für dailyclone.sh:

    • epmautomatescript mit dem Speicherort der ausführbaren Datei für EPM Automate. Beispiel: epmautomatescript="/home/utils/EPMAutomate/bin/epmautomate.sh"
    • javahome mit dem Verzeichnis, in dem das von EPM Automate verwendete JDK installiert ist. Beispiel: "/home/user1/jdk1.8.0_191"
    Update für dailyclone.ps1 und dailyclone.sh:
    • users_and_predefined_roles: Setzen Sie diesen Wert auf true, um Benutzer und ihre vordefinierten Rollenzuweisungen zu klonen (Gruppen für die Zugriffskontrolle werden immer geklont).
    • data_management: Setzen Sie diesen Wert auf false, um Datensätze der Datenintegration nicht zu klonen. Beachten Sie, dass Datensätze der Datenintegration nur geklont werden können, wenn für die Quell- und Zielumgebung dieselbe monatliche Aktualisierung gilt oder wenn die Zielumgebung genau eine neuere Aktualisierung aufweist als die Quellumgebung. Beispiel: Sie können die Datenmanagement-Datensätze für 22.01 nur in eine andere 22.01-Umgebung oder in eine 22.02-Umgebung klonen.

      Wird für Narrative Reporting- und Oracle Enterprise Data Management Cloud-Umgebungen ignoriert.

    • app_audit: Setzen Sie diesen Wert auf false, wenn die Anwendungsauditdaten für Planning-, FreeForm- und Enterprise Profitability and Cost Management-Anwendungen nicht geklont werden sollen.

      Auditdaten für Financial Consolidation and Close und Tax Reporting werden immer geklont.

    • job_console: Setzen Sie diesen Wert auf false, wenn Jobkonsolendaten nicht geklont werden sollen.
    • stored_snapshots_and_files: Setzen Sie diesen Wert auf true, wenn Sie den Inhalt der Ordner der obersten Ebene in der Inbox und der Outbox der Quellumgebung klonen möchten (Unterordner werden nie geklont).
    • daily_maintenance_start_time: Setzen Sie diesen Wert auf false, wenn die Startzeit für die Wartung der geklonten Zielumgebung nicht auf die Startzeit der Quellumgebung zurückgesetzt werden soll.
    Updates für das Groovy-Skript dailyclone:
    • source_username ist der Benutzername eines Serviceadministrators. Die Rolle Identitätsdomainadministrator ist zum Klonen von Benutzern und vordefinierten Rollen erforderlich.
    • source_password ist das Kennwort des durch SOURCE_USERNAME bestimmten Benutzers.
    • source_url ist die URL der Umgebung, die Sie klonen möchten.
    • target_username ist der Benutzername eines Serviceadministrators. Die Rolle Identitätsdomainadministrator ist zum Klonen von Benutzern und vordefinierten Rollen erforderlich.
    • target_password ist das Kennwort des durch TARGET_USERNAME bestimmten Benutzers.
    • target_URL ist die URL der Zielumgebung.
  3. Führen Sie dailyclone.ps1, dailyclone.sh oder das Groovy-Skript dailyclone aus:

    Windows

    • Navigieren Sie in einem Befehlsfenster zu dem Ordner, in dem dailyclone.ps1 gespeichert ist.
    • Führen Sie den folgenden Befehl aus: ./dailyclone.ps1 SOURCE_USERNAME SOURCE_PASSWORD SOURCE_URL TARGET_USERNAME TARGET_PASSWORD TARGET_URL. Beschreibungen dieser Werte finden Sie in der folgenden Tabelle.

    Table 3-7 Beschreibung der Parameter

    Parameter Beschreibung
    SOURCE_USERNAME Der Benutzername eines Serviceadministrators. Zudem muss dieser Benutzer auch über die Rolle Identitätsdomainadministrator verfügen, um Benutzer und vordefinierte Rollen zu klonen.
    SOURCE_PASSWORD Das Kennwort des durch SOURCE_USERNAME bestimmten Benutzers.
    SOURCE_URL Die URL der Umgebung, die Sie klonen möchten.
    TARGET_USERNAME Der Benutzername eines Serviceadministrators in der Zielumgebung. Zudem muss dieser Benutzer auch über die Rolle Identitätsdomainadministrator verfügen, um Benutzer und vordefinierte Rollen zu klonen.
    TARGET_PASSWORD Das Kennwort des durch TARGET_USERNAME bestimmten Benutzers.
    TARGET_URL Die URL der Zielumgebung.
    Linux/UNIX
    • Navigieren Sie in einer UNIX- oder Linux-Shell in das Verzeichnis, in dem dailyclone.sh gespeichert ist.
    • Führen Sie den folgenden Befehl aus: ./dailyclone.sh SOURCE_USERNAME SOURCE_PASSWORD SOURCE_URL TARGET_USERNAME TARGET_PASSWORD TARGET_URL. Beschreibungen dieser Werte finden Sie in der vorherigen Tabelle.
    Groovy

    Informationen finden Sie unter Befehle ohne Installation von EPM Automate ausführen.