Introdução

O Oracle Fleet Patching and Provisioning (FPP) contém toda a automação necessária para realizar a instalação, patch e upgrade do software do Grid e do Database, cobrindo os aspectos que são comuns em qualquer ambiente. No entanto, é comum que alguns ambientes tenha detalhes específicos do que fazer antes, durante ou depois de uma aplicação de patch, demandando pequenas customizações.

Para atender a necessidade específica de cada ambiente e permitir que o DBA possa incluir pequenas customizações no processo, o FPP tem uma feature chamada User Action. Essa feature nada mais é do que a possibilidade de anexar scripts Shell para serem executados pelo FPP antes ou após determinada fase do processo.

A ilustração abaixo foi retirada da minha apresentação no GUOB Tech Day 2024:

Essa solução pode ser usada para automatizar blackouts em agentes de monitoração, pausa de rotinas de backups, modificação de arquivos de configuração, ou qualquer coisa parecida que seja específica do seu ambiente.

Outra possibilidade também é poder criar checklists customizados que podem ser usados para forçar o FPP a abortar uma ação em determinados cenários. Por exemplo, se não é permitido que o banco de dados seja reiniciado durante a execução de um determinado JOB de negócio, podemos criar um script shell que faça essa verificação e force o FPP abortar o processo de Move Database antes mesmo dele iniciar.

Sobre o Fluxo

Assumindo que você já tem um script pronto para ser executado, no FPP é necessário executar duas etapas simples: Criar a User Action com o script desejado, e vincular essa User Action a uma Image Type .

A ilustração abaixo (GUOB Tech Day 2024) apresenta um exemplo criando duas User Actions onde o mesmo script deve ser executado antes e depois do MOVE_DATABASE.

Parte 1

A primeira parte é criar a User Action com o comando “rhpctl add useraction“, o qual recebe os seguintes parâmetros básicos:

  • -useraction -> Indica o nome da User Action que estamos criando
  • -actionscript -> Indica o caminho do arquivo .sh que queremos anexar
  • -obtype -> Indica em qual fase do FPP queremos que esse script seja executado
  • -pre / -post -> Indica se o script deve ser executado antes ou depois que fase indicada em -obtype
  • -oneerror -> Indica o que o FPP deve fazer caso o script termine com erro
  • -runscope -> Indica em qual node o script deve ser executado quando o target for um cluster

Na ilustração, estamos criando duas User Actions que irão executar o mesmo script, uma chamada “stop_ogg” para ser executada antes da operação MOVE_DATABASE (fase em que as instâncias do banco são reiniciadas para o novo OH), e outra chamada “start_ogg” para ser executada após a conclusão dessa fase.

Ambos estão configuradas para continuar a execução normalmente caso o script apresente erro (-oneerror CONTINUE), e também estamos definindo que a ação deve ser executada em todos os nodes quando o target for um RAC (-runscope ALLNODES). Aqui um detalhe importante, o FPP executará o script em um node por vez, seguindo a mesma ordem do Rolling Patch (a menos que você use a opção -nonrolling, é claro).

Usando a opção -h, podemos ver todas as opções suportadas, com os possíveis valores que são aceitos:

[grid@fppserver ~]$ rhpctl add useraction -h

Configures a new user action of the specified name with its associated script and action file.

Usage: rhpctl add useraction -useraction <user_action_name> -actionscript <script_name>
	[-actionfile <file_name>]
	{-pre |
	 -post} -optype
	{IMPORT_IMAGE |
	 ADD_WORKINGCOPY |
	 DELETE_WORKINGCOPY |
	 ADD_DATABASE |
	 DELETE_DATABASE |
	 ADD_PDB_DATABASE |
	 DELETE_PDB_DATABASE |
	 MOVE_DATABASE |
	 MOVE_GIHOME |
	 UPGRADE_DATABASE |
	 UPGRADE_GIHOME |
	 ADDNODE_GIHOME |
	 DELETENODE_GIHOME |
	 ADDNODE_DATABASE |
	 DELETENODE_DATABASE |
	 ADDNODE_WORKINGCOPY |
	 ZDTUPGRADE_DATABASE |
	 ZDTUPGRADE_DATABASE_SNAPDB |
	 ZDTUPGRADE_DATABASE_DBUA |
	 ZDTUPGRADE_DATABASE_SWITCHBACK |
	 MIGRATE_DATABASE }
	[-phase <operation phase>]
	[-onerror
		{ABORT |
		 CONTINUE}]
	[-runscope
		{ONENODE |
		 ALLNODES |
		 AUTO |
		 FIRSTNODEONRHPS |
		 LASTNODEONRHPS |
		 ALLNODESONRHPS}]
	[-runasroot]
	[-runninginstance]

    -useraction <user_action_name>    Name of the user action
    -actionscript <script_name>       Script file to be executed
    -actionfile <file_name>           Accompanying file needed by the user action
    -pre                              To execute the user action before the operation
    -post                             To execute the user action after the operation
    -optype {IMPORT_IMAGE | ADD_WORKINGCOPY | DELETE_WORKINGCOPY | ADD_DATABASE | DELETE_DATABASE | ADD_PDB_DATABASE | DELETE_PDB_DATABASE | MOVE_DATABASE | MOVE_GIHOME | UPGRADE_DATABASE | UPGRADE_GIHOME | ADDNODE_GIHOME | DELETENODE_GIHOME | ADDNODE_DATABASE | DELETENODE_DATABASE | ADDNODE_WORKINGCOPY | ZDTUPGRADE_DATABASE | ZDTUPGRADE_DATABASE_SNAPDB | ZDTUPGRADE_DATABASE_DBUA | ZDTUPGRADE_DATABASE_SWITCHBACK | MIGRATE_DATABASE}
                                      Operation for which the user action is configured
    -phase <phase of operation>       Operation phase for which the user action is configured
    -onerror {ABORT | CONTINUE}       The outcome if the user action encounters an error during execution
    -runscope {ONENODE | ALLNODES | AUTO | FIRSTNODEONRHPS | LASTNODEONRHPS | ALLNODESONRHPS}
                                      The nodes where the user action will be run. Specify AUTO to choose run scope based on the other command options. Specify FIRSTNODEONRHPS, LASTNODEONRHPS or ALLNODESONRHPS to run the user action script on RHPS when the operaton is performed on first node or last node or all nodes.
    -runasroot                        Run the useraction as root user.
    -runninginstance                  Run the useraction only on nodes with a running database instance. Applicable only for operation type MOVE_DATABASE, MOVE_GIHOME, UPGRADE_DATABASE.
Parte 2

Uma vez que temos a User Action criada, podemos vincular ela a uma Image Type do GRID ou do RDBMS, somente as User Actions que estão vinculadas a uma Image Type são executadas. Para vincular uma ou mais User Action em uma Image Type, usamos o comando “rhpctl modify imagetype“.

O FPP suporta diferentes tipos de software além do GRID e RDBMS (eu só tenho experiência com esses dois). Na ilustração estamos criando um exemplo em que o script deve ser executado cada vez que tiver uma operação envolvendo o software do RDBMS, então usamos a imagetype ORACLEDBSOFTWARE.

Se você quiser saber todas todas as imagetype base suportadas pelo FPP em uso no momento, pode usar o comando abaixo (essa lista pode variar de acordo a versão do FPP):

[grid@fppserver ~]$ rhpctl query imagetype
fppserver.dibiei.com: Audit ID: 3851
Image type: BASE_SOFTWARE
Image type: ORACLEDBSOFTWARE
Image type: SOFTWARE
Image type: ORACLEGISOFTWARE
Image type: ODAPATCHSOFTWARE
Image type: EXAPATCHSOFTWARE
Image type: ORACLEGGSOFTWARE
Image type: CUSTOM_PLUGIN
Image type: LINUXOS

Demo

Para fornecer um exemplo simples, irei criar um script apenas para apresentar um “Hello World”, e demonstrar como podemos capturar as informações do contexto da execução do FPP.

O script abaixo apresenta um “Hello World” 5 vezes, captura os valores passados como parâmetros para o script e exporta esses valores como variável do shell.

# Hello world with 5 interactions
echo "Starting FPP User Action"

export LOOP_SIZE=5
for ((i=1; i<=$LOOP_SIZE; i++))
do
  echo "Hello World $i of $LOOP_SIZE"
  sleep 1
done


# convert parameters to variables
for RHP_VARIABLE in "$@" ; do
 export $RHP_VARIABLE
 echo "DEBUG: $RHP_VARIABLE" 
done

# example reading exported variable from FPP context
IS_MOVE_DATABASE="No"
if [ "$RHP_PHASE" == "MOVE_DATABASE" ]; then
 IS_MOVE_DATABASE="yes"
fi

echo "Is FPP Move Database: $IS_MOVE_DATABASE"

echo "FPP User Action completed !"

Antes de criar a User Action, precisamos garantir que o script tem permissão de execução:

chmod + hello_world.sh

Testando o script manualmente:

[grid@fppserver demo]$ ./hello_world.sh
Starting FPP User Action
Hello World 1 of 5
Hello World 2 of 5
Hello World 3 of 5
Hello World 4 of 5
Hello World 5 of 5
Is FPP Move Database: No
FPP User Action completed !

Simulando com alguns parâmetros que podem ser passados automaticamente pelo FPP:

[grid@fppserver demo]$ ./hello_world.sh RHP_PHASE=MOVE_DATABASE RHP_WORKINGCOPY=WC_DB1925_lab05
Starting FPP User Action
Hello World 1 of 5
Hello World 2 of 5
Hello World 3 of 5
Hello World 4 of 5
Hello World 5 of 5
DEBUG: RHP_PHASE=MOVE_DATABASE
DEBUG: RHP_WORKINGCOPY=WC_DB1925_lab05
Is FPP Move Database: yes
FPP User Action completed !

Agora podemos criar uma User Action de teste usando o comando “rhpctl add useraction“:

rhpctl add useraction \
 -useraction hello_world_db \
 -actionscript /home/grid/demo/hello_world.sh \
 -optype MOVE_DATABASE -pre \
 -runscope ALLNODES \
 -onerror CONTINUE

E vinculamos a User Action a Image Type ORACLEDBSOFTWARE:

rhpctl modify imagetype -imagetype ORACLEDBSOFTWARE -useractions hello_world_db

Agora vou testar um move database:

 rhpctl move database \
 -patchedwc WC_DB1922_lab06 \
 -sourcewc WC_DB1925_lab06 \
 -dbname DB06A \
 -cred dibiei_root \
 -ignorewcpatches -nodatapatch \
 -schedule NOW

O output do script é apresentado no output do FPP.

Exemplo de como a execução da User Action deve aparecer no output do JOB:

[grid@fppserver demo]$ rhpctl query job -jobid 260
fppserver.dibiei.com: Audit ID: 3863
Job ID: 260
User: grid
Client: STANDALONE_lab06
Scheduled job command: "rhpctl move database -patchedwc WC_DB1922_lab06 -sourcewc WC_DB1925_lab06 -dbname DB06A -cred dibiei_root -ignorewcpatches -nodatapatch -schedule NOW"
Scheduled job execution start time: 2025-01-24T15:34:17-03. Equivalent local time: 2025-01-24 15:34:17
Current status: SUCCEEDED
Result file path: "/fpp/chkbase/scheduled/job-260-2025-01-24-15:34:42.log"
Job execution start time: 2025-01-24 15:34:43
Job execution end time: 2025-01-24 15:36:29
Job execution elapsed time: 1 minutes 46 seconds

Result file "/fpp/chkbase/scheduled/job-260-2025-01-24-15:34:42.log" contents:
fppserver.dibiei.com: Processing arguments file /u01/app/grid/crsdata/fppserver/rhp/conf/rhp.pref
fppserver.dibiei.com: Audit ID: 3861
fppserver.dibiei.com: verifying versions of Oracle homes ...
fppserver.dibiei.com: verifying owners of Oracle homes ...
fppserver.dibiei.com: verifying groups of Oracle homes ...
fppserver.dibiei.com: starting to move the following databases: "DB06A"
fppserver.dibiei.com: executing user actions ...
fppserver.dibiei.com: Executing user action hello_world_db for database DB06A on nodes "lab06"...
lab06: Starting FPP User Action
lab06: Hello World 1 of 5
lab06: Hello World 2 of 5
lab06: Hello World 3 of 5
lab06: Hello World 4 of 5
lab06: Hello World 5 of 5
lab06: DEBUG: RHP_OPTYPE=MOVE_DATABASE
lab06: DEBUG: RHP_PHASE=PRE
lab06: DEBUG: RHP_SOURCEWC=WC_DB1925_lab06
lab06: DEBUG: RHP_SOURCEPATH=/u01/app/oracle/product/19.25.0.0/dbhome_1
lab06: DEBUG: RHP_DESTINATIONWC=WC_DB1922_lab06
lab06: DEBUG: RHP_DESTINATIONPATH=/u01/app/oracle/product/19.22.0.0/dbhome_1
lab06: DEBUG: RHP_DBNAME=DB06A
lab06: DEBUG: RHP_PROGRESSLISTENERHOST=10.1.1.25
lab06: DEBUG: RHP_PROGRESSLISTENERPORT=17327
lab06: DEBUG: RHP_IMAGE=DB1924
lab06: DEBUG: RHP_IMAGETYPE=ORACLEDBSOFTWARE
lab06: DEBUG: RHP_VERSION=19.0.0.0.0
lab06: DEBUG: RHP_CLI=rhpctl__move__database__-patchedwc__WC_DB1922_lab06__-sourcewc__WC_DB1925_lab06__-dbname__DB06A__-cred__dibiei_root__-ignorewcpatches__-nodatapatch__-schedule__NOW
lab06: DEBUG: RHP_DATAPATCH=
lab06: DEBUG: RHP_NODES=lab06
lab06: DEBUG: RHP_EXEC_NODE=null
lab06: DEBUG: RHP_CLIENT=STANDALONE_lab06
lab06: DEBUG: RHP_USERACTIONDATA=
lab06: DEBUG: RHP_TARGETNODE=lab06
lab06: Is FPP Move Database: No
lab06: FPP User Action completed !
fppserver.dibiei.com: Done executing user action hello_world_db...
fppserver.dibiei.com: restarting databases: "DB06A" ...
lab06:
lab06: SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jan 24 15:36:03 2025
lab06: Version 19.25.0.0.0
lab06:
lab06: Copyright (c) 1982, 2024, Oracle.  All rights reserved.
lab06:
lab06:
lab06: Connected to:
lab06: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
lab06: Version 19.25.0.0.0
lab06:
lab06: SQL>
lab06: Pluggable database altered.
lab06:
lab06: SQL> Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
lab06: Version 19.25.0.0.0
fppserver.dibiei.com: stopping instances of databases "DB06A" ...
lab06:
lab06: SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jan 24 15:36:04 2025
lab06: Version 19.25.0.0.0
lab06:
lab06: Copyright (c) 1982, 2024, Oracle.  All rights reserved.
lab06:
lab06:
lab06: Connected to:
lab06: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
lab06: Version 19.25.0.0.0
lab06:
lab06: SQL> Database closed.
lab06: Database dismounted.
lab06: ORACLE instance shut down.
lab06: SQL> Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
lab06: Version 19.25.0.0.0
fppserver.dibiei.com: Completed the 'move database' operation for databases: "DB06A"

Todas essas linhas com “DEBUG:” são os parâmetros passados pelo FPP e capturados pelo o script.

User Action Data

Se você quiser passar alguma informação específica durante a execução dos comandos RHPCTL para ser usada internamente pelo script da User Action, você pode usar a opção -useractiondata.

Exemplo:

 rhpctl move database \
 -useractiondata "EVENT=GUOB_TECH_DAY YEAR=2024 BLOG=dibiei.blog" \
 -patchedwc WC_DB1922_lab06 \
 -sourcewc WC_DB1925_lab06 \
 -dbname DB06A \
 -cred dibiei_root \
 -ignorewcpatches -nodatapatch \
 -schedule NOW

O valor informado ali será passado para o script como o argumento RHP_USERACTIONDATA:

Exemplo:

fppserver.dibiei.com: executing user actions ...
fppserver.dibiei.com: Executing user action hello_world_db for database DB06A on nodes "lab06"...
lab06: Starting FPP User Action
lab06: Hello World 1 of 5
lab06: Hello World 2 of 5
lab06: Hello World 3 of 5
lab06: Hello World 4 of 5
lab06: Hello World 5 of 5
lab06: DEBUG: RHP_OPTYPE=MOVE_DATABASE
lab06: DEBUG: RHP_PHASE=PRE
lab06: DEBUG: RHP_SOURCEWC=WC_DB1925_lab06
lab06: DEBUG: RHP_SOURCEPATH=/u01/app/oracle/product/19.25.0.0/dbhome_1
lab06: DEBUG: RHP_DESTINATIONWC=WC_DB1922_lab06
lab06: DEBUG: RHP_DESTINATIONPATH=/u01/app/oracle/product/19.22.0.0/dbhome_1
lab06: DEBUG: RHP_DBNAME=DB06A
lab06: DEBUG: RHP_PROGRESSLISTENERHOST=10.1.1.25
lab06: DEBUG: RHP_PROGRESSLISTENERPORT=36743
lab06: DEBUG: RHP_IMAGE=DB1924
lab06: DEBUG: RHP_IMAGETYPE=ORACLEDBSOFTWARE
lab06: DEBUG: RHP_VERSION=19.0.0.0.0
lab06: DEBUG: RHP_CLI=rhpctl__move__database__-useractiondata__EVENT=GUOB_TECH_DAY__YEAR=2024__BLOG=dibiei.blog__-patchedwc__WC_DB1922_lab06__-sourcewc__WC_DB1925_lab06__-dbname__DB06A__-cred__dibiei_root__-ignorewcpatches__-nodatapatch__-schedule__NOW
lab06: DEBUG: RHP_DATAPATCH=
lab06: DEBUG: RHP_NODES=lab06
lab06: DEBUG: RHP_EXEC_NODE=null
lab06: DEBUG: RHP_CLIENT=STANDALONE_lab06
lab06: DEBUG: RHP_USERACTIONDATA=EVENT=GUOB_TECH_DAY__YEAR=2024__BLOG=dibiei.blog
lab06: DEBUG: RHP_TARGETNODE=lab06
lab06: Is FPP Move Database: No
lab06: FPP User Action completed !
fppserver.dibiei.com: Done executing user action hello_world_db...

O único ponto de atenção é que os espaços vazios na string são substituídos por “_”, então você precisa considerar isso se for usar essa opção na lógica do script.

Usando Um Arquivo Auxiliar

Se apenas um script shell não for o suficiente, podemos usar a opção -actionfile para anexar um arquivo adicional junto com o script. Nessa opção podemos passar qualquer arquivo que quisermos, como outro script shell, um java, ou até mesmo um arquivo .zip contendo outros arquivos que o script principal necessite.

Para demonstrar essa função, eu vou criar dois arquivos de textos (file1.txt e file2.txt), e adicioná-los em um arquivo example_files.zip. O script example_script.sh irá descompactar esse arquivo e executar um cat nos dois arquivos de texto.

Preparando o arquivo example_files.zip:

[grid@fppserver demo2]$ echo "This is file 1" > file1.txt
[grid@fppserver demo2]$ echo "This is file 2" > file2.txt
[grid@fppserver demo2]$
[grid@fppserver demo2]$ zip example_files.zip *.txt
  adding: file1.txt (stored 0%)
  adding: file2.txt (stored 0%)
[grid@fppserver demo2]$
[grid@fppserver demo2]$ rm -f *.txt

O código do arquivo example_script.sh

# go to script directory
SCRIPT_DIR=$(dirname "$0")
cd $SCRIPT_DIR

echo "Extracting txt file ..."
unzip example_files.zip

echo "Using txt files ..."
cat file1.txt
cat file2.txt

Quando a User Action é executada, o FPP copia ambos os arquivos para um diretório no /tmp do servidor de destino. Para garantir que o script principal encontrará o arquivo auxiliar, eu uso essa técnica de identificar o caminho no qual o script está sendo executado (linha 2), e em seguida alterno para esse diretório com o comando “cd” (linha 3). Esse é um detalhe importante porque não existe um diretório padrão que o FPP usa, ele sempre cria um com nome diferente para cada nova execução.

Agora temos os dois arquivos prontos:

[grid@fppserver demo2]$ ls -l
total 8
-rw-r--r-- 1 grid oinstall 344 Jan 24 16:46 example_files.zip
-rwxr-xr-x 1 grid oinstall 111 Jan 24 16:51 example_script.sh

Esse deve ser o resultado esperado quando executamos o script:

[grid@fppserver demo2]$ ./example_script.sh
Extracting txt file ...
Archive:  example_files.zip
 extracting: file1.txt
 extracting: file2.txt
Using txt files ...
This is file 1
This is file 2

Criando uma nova User Action com o nome example_multi_files:

rhpctl add useraction \
 -useraction example_multi_files \
 -actionscript /home/grid/demo2/example_script.sh \
 -actionfile /home/grid/demo2/example_files.zip \
 -optype MOVE_DATABASE -pre \
 -runscope ALLNODES \
 -onerror CONTINUE

Vinculando essa nova User Action example_multi_files a Image Type ORACLEDBSOFTWARE:

rhpctl modify imagetype -imagetype ORACLEDBSOFTWARE -useractions example_multi_files

Testando o move novamente, dessa vez invertendo OH de origem e destino:

 rhpctl move database \
 -patchedwc WC_DB1925_lab06 \
 -sourcewc WC_DB1922_lab06 \
 -dbname DB06A \
 -cred dibiei_root \
 -ignorewcpatches -nodatapatch \
 -schedule NOW

Acompanhando o progresso do JOB e validando que o script foi executado com sucesso:

[grid@fppserver demo2]$ rhpctl query job -jobid 266
fppserver.dibiei.com: Audit ID: 3889
Job ID: 266
User: grid
Client: STANDALONE_lab06
Scheduled job command: "rhpctl move database -patchedwc WC_DB1925_lab06 -sourcewc WC_DB1922_lab06 -dbname DB06A -cred dibiei_root -ignorewcpatches -nodatapatch -schedule NOW"
Scheduled job execution start time: 2025-01-24T18:19:31-03. Equivalent local time: 2025-01-24 18:19:31
Current status: SUCCEEDED
Result file path: "/fpp/chkbase/scheduled/job-266-2025-01-24-18:19:50.log"
Job execution start time: 2025-01-24 18:19:51
Job execution end time: 2025-01-24 18:21:12
Job execution elapsed time: 1 minutes 21 seconds

Result file "/fpp/chkbase/scheduled/job-266-2025-01-24-18:19:50.log" contents:
fppserver.dibiei.com: Processing arguments file /u01/app/grid/crsdata/fppserver/rhp/conf/rhp.pref
fppserver.dibiei.com: Audit ID: 3887
fppserver.dibiei.com: verifying versions of Oracle homes ...
fppserver.dibiei.com: verifying owners of Oracle homes ...
fppserver.dibiei.com: verifying groups of Oracle homes ...
fppserver.dibiei.com: starting to move the following databases: "DB06A"
fppserver.dibiei.com: executing user actions ...
fppserver.dibiei.com: Executing user action example_multi_files for database DB06A on nodes "lab06"...
lab06: Extracting txt file ...
lab06: Archive:  example_files.zip
lab06:  extracting: file1.txt
lab06:  extracting: file2.txt
lab06: Using txt files ...
lab06: This is file 1
lab06: This is file 2
fppserver.dibiei.com: Done executing user action example_multi_files...
fppserver.dibiei.com: restarting databases: "DB06A" ...
lab06:
lab06: SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jan 24 18:20:44 2025
lab06: Version 19.22.0.0.0
lab06:
lab06: Copyright (c) 1982, 2023, Oracle.  All rights reserved.
lab06:
lab06:
lab06: Connected to:
lab06: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
lab06: Version 19.22.0.0.0
lab06:
lab06: SQL>
lab06: Pluggable database altered.
lab06:
lab06: SQL> Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
lab06: Version 19.22.0.0.0
fppserver.dibiei.com: stopping instances of databases "DB06A" ...
lab06:
lab06: SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jan 24 18:20:45 2025
lab06: Version 19.22.0.0.0
lab06:
lab06: Copyright (c) 1982, 2023, Oracle.  All rights reserved.
lab06:
lab06:
lab06: Connected to:
lab06: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
lab06: Version 19.22.0.0.0
lab06:
lab06: SQL> Database closed.
lab06: Database dismounted.
lab06: ORACLE instance shut down.
lab06: SQL> Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
lab06: Version 19.22.0.0.0
fppserver.dibiei.com: Completed the 'move database' operation for databases: "DB06A"

No servidor de destino, podemos procurar por diretórios que começam com “useractions” dentro do /tmp. Terá uma pasta para cada execução, e dentro dela terá uma sub-pasta para cada User Action.

Exemplo:

Ativando Múltiplas User Actions

Até aqui eu demonstrei dois exemplos diferentes e isolados, mas podemos criar múltiplas User Actions diferentes e vincular elas na mesma Image Type. Para isso, precisamos informar os nomes das User Actions separando por vígula, como no exemplo abaixo:

rhpctl modify imagetype \
 -imagetype ORACLEDBSOFTWARE \
 -useractions example_multi_files,hello_world_db

O ponto de atenção aqui é que esse comando sempre define a lista final de User Actions que a Image Type vai ter, ela não funciona como um “ADD”, mas sim como um “UPDATE”.

Para saber quais User Actions estão ativas atualmente, evitando perder o que já foi configurado antes, use o comando “rhpctl query imagetype” para listar os detalhes da Image Type em questão.

Exemplo:

[grid@fppserver demo2]$ rhpctl query imagetype -imagetype ORACLEDBSOFTWARE
fppserver.dibiei.com: Audit ID: 3894
Image type: ORACLEDBSOFTWARE
Base image type: BASE_SOFTWARE
User actions: example_multi_files, hello_world_db
Images: DB1924, DB11204, DB1925, DB2305
Access control: ROLE:GH_IMGTYPE_ADMIN
Access control: ROLE:GH_IMGTYPE_ALLOW
Access control: ROLE:GH_IMGTYPE_OPER

Consultando User Actions Existentes

Podemos consultar a lista de todas as User Actions existentes no FPP com o comando “rhpctl query useraction“, como no exemplo abaixo:

[grid@fppserver ~]$ rhpctl query useraction
fppserver.dibiei.com: Audit ID: 3895
User action name: listener_helper_standalone
User action name: listener_helper_grid
User action name: hello_world_db
User action name: example_multi_files

Podemos obter os detalhes de como a User Action foi configurada passando o nome dela como filtro:

[grid@fppserver ~]$ rhpctl query useraction -useraction example_multi_files
fppserver.dibiei.com: Audit ID: 3896
User action name: example_multi_files
Action script: example_script.sh
Action file: example_files.zip
Operation type: MOVE_DATABASE
Pre-operation or post-operation: PRE
On error: CONTINUE
Run scope: ALLNODES
Run as root: NO

Modificando Uma User Action

Se precisarmos alterar um atributo ou atualizar o script de uma User Action, podemos usar o comando “rhpctl modify useraction“.

O exemplo abaixo atualiza o valor do atributo -onerror para ABORT, fazendo com que o processo seja abortado quando ocorrer um erro:

rhpctl modify useraction -useraction example_multi_files -onerror ABORT

Quando criamos uma User Action, os arquivos informados como -actionscript e -actionfile são carregados para um repositório ACFS do FPP, não tendo mais nenhuma relação com o arquivo original que foi usado para criar a User Action. Para atualizar o conteúdo desses arquivos, executamos um modify passando o caminho dos arquivos atualizados, isso fará com que o FPP importe o arquivo novamente.

O examplo abaixo atualiza o conteúdo do script da User Action com o conteúdo do arquivo .sh sendo informado:

rhpctl modify useraction \
 -useraction example_multi_files \
 -actionscript /home/grid/demo2/example_script.sh

Deletando Uma User Action

Para deletar uma User Action, usamos o comando “rhpctl delete useraction“, mas para isso ela não pode estar vinculada a nenhuma Image Type.

O exemplo abaixo falha porque estou tentando deletar a User Action que ainda está vinculada a Image Type ORACLEDBSOFTWARE:

[grid@fppserver ~]$ rhpctl delete useraction -useraction hello_world_db
fppserver.dibiei.com: Audit ID: 3900
PRGO-1424 : Delete operation failed because user action "hello_world_db" is being used by the following image types: "ORACLEDBSOFTWARE".

Para deletar, primeiro precisamos remover ela da lista de User Actions vinculadas a Image Type em questão. Infelizmente essa parte não é muito intuitiva, pois não tem uma ação explicita de “remover”. A forma de desvincular é modificando a Image Type deixando apenas a lista de User Actions que desejamos manter.

No exemplo abaixo estou atualizando a lista deixando apenas a User Action “example_multi_files”, dessa forma removendo a “hello_world_db”:

[grid@fppserver ~]$ rhpctl modify imagetype -imagetype ORACLEDBSOFTWARE -useractions example_multi_files
fppserver.dibiei.com: Audit ID: 3901

Agora consigo deletar a User Action “hello_world_db”:

[grid@fppserver ~]$ rhpctl delete useraction -useraction hello_world_db
fppserver.dibiei.com: Audit ID: 3902

Conclusão

Esse post apresentou como funciona o recurso de User Actions no Fleet Patching and Provisioning (FPP), assim como exemplos didáticos para ajudar na compreensão de como os parâmetros se comporta. Esse é um recurso poderoso do FPP que você pode utilizar para incluir suas próprias verificações e customazações específicas do seu ambiente dentro do processo de automação que já entregue pela Oracle.

Referências:

User Actions for Common Fleet Patching and Provisioning Tasks

Oracle Fleet Patching and Provisioning 23ai Technical Presentation (by Philippe Fierens)

Mais informações e documentos sobre o FPP:

https://www.oracle.com/database/technologies/rac/fpp.html

Leave a Reply

Discover more from Blog do Dibiei

Subscribe now to keep reading and get access to the full archive.

Continue reading