Configuração de script do fornecedor e manuais do Ansible
O arquivo de configuração do provedor, o script de execução e os playbooks do Ansible a seguir são usados durante a implantação de amostra e a execução do fluxo de trabalho nesta documentação.
Os scripts de exemplo são fornecidos como estão e não são suportados pelo NetApp. Você pode solicitar a versão atual dos scripts via e-mail para mailto:ng-sapcc em NetApp.com[ng-sapcc em NetApp.com]. |
Arquivo de configuração do provedor NetApp_clone.conf
O arquivo de configuração é criado conforme descrito no "Documentação do SAP lama - Configurando os scripts registrados do SAP Host Agent". Esse arquivo de configuração deve estar localizado no nó de controle do Ansible, onde o agente de host SAP está instalado.
O usuário os configurado sapuser
deve ter as permissões apropriadas para executar o script e os playbooks chamados Ansible. Você pode colocar o script em um diretório de script comum. O SAP lama pode fornecer vários parâmetros ao chamar o script.
Além dos parâmetros personalizados, PARAM_ClonePostFix
PROP_ClonePostFix
, PARAM_ClonePostFix
, e PROP_ClonePostFix
, muitos outros podem ser entregues, como é mostrado no "Documentação do SAP lama".
root@sap-jump:~# cat /usr/sap/hostctrl/exe/operations.d/netapp_clone.conf Name: netapp_clone Username: sapuser Description: NetApp Clone for Custom Provisioning Command: /usr/sap/scripts/netapp_clone.sh --HookOperationName=$[HookOperationName] --SAPSYSTEMNAME=$[SAPSYSTEMNAME] --SAPSYSTEM=$[SAPSYSTEM] --MOUNT_XML_PATH=$[MOUNT_XML_PATH] --PARAM_ClonePostFix=$[PARAM-ClonePostFix] --PARAM_SnapPostFix=$[PARAM-SnapPostFix] --PROP_ClonePostFix=$[PROP-ClonePostFix] --PROP_SnapPostFix=$[PROP-SnapPostFix] --SAP_LVM_SRC_SID=$[SAP_LVM_SRC_SID] --SAP_LVM_TARGET_SID=$[SAP_LVM_TARGET_SID] ResulConverter: hook Platform: Unix
Script de provedor NetApp_clone.sh
O script do provedor deve ser armazenado /usr/sap/scripts
como configurado no arquivo de configuração do provedor.
Variáveis
As variáveis a seguir são codificadas no script e devem ser adaptadas de acordo.
-
`PRIMARY_CLUSTER=`nome de anfitrião do cluster NetApp>
-
`PRIMARY_SVM=`Nome do SVM onde os volumes do sistema de origem são armazenados>
Os arquivos de certificado PRIMARY_KEYFILE=/usr/sap/scripts/ansible/certs/ontap.key
e PRIMARY_CERTFILE=/usr/sap/scripts/ansible/certs/ontap.pem
devem ser fornecidos conforme descrito "Módulos do NetApp Ansible - Prepare o ONTAP" em .
Se diferentes clusters ou SVMs forem necessários para diferentes sistemas SAP, essas variáveis podem ser adicionadas como parâmetros na definição do provedor SAP lama. |
Função: Criar arquivo de inventário
Para tornar a execução do manual do Ansible mais dinâmica, é criado um inventory. yml
arquivo imediatamente. Alguns valores estáticos são configurados na seção variável e alguns são criados dinamicamente durante a execução.
Função: Execute o manual de estratégia do Ansible
Essa função é usada para executar o manual de estratégia do Ansible juntamente com o arquivo criado dinamicamente inventory.yml
. A convenção de nomenclatura para os playbooks é netapp_lama_${HookOperationName}.yml
. Os valores para ${HookOperationName}
dependem da operação Lama e entregues pelo Lama como parâmetro de linha de comando.
Secção Principal
Esta seção contém o plano de execução principal. A variável ${HookOperationName}
contém o nome da etapa de substituição Lama e é fornecida pelo Lama quando o script é chamado.
-
Valores com o fluxo de trabalho de clone do sistema e provisionamento de cópia do sistema:
-
CloneVolumes
-
PostCloneVolumes
-
-
Valor com o fluxo de trabalho de destruição do sistema:
-
ServiceConfigRemoção
-
-
Valor com o fluxo de trabalho de atualização do sistema:
-
ClearMountConfig
-
Nome da conexão: CloneVolumes
Com essa etapa, o manual de estratégia do Ansible é executado, o que aciona a operação de clonagem e cópia Snapshot. Os nomes de volume e a configuração de montagem são entregues pelo SAP lama por meio de um arquivo XML definido na variável $MOUNT_XML_PATH
. Esse arquivo é salvo porque é usado mais tarde na etapa FinalizeCloneVolumes
para criar a nova configuração de ponto de montagem. Os nomes de volume são extraídos do arquivo XML e o manual de estratégia de clonagem do Ansible é executado para cada volume.
Neste exemplo, a instância AS e os serviços centrais compartilham o mesmo volume. Portanto, a clonagem de volume só é executada quando o número da instância SAP ($SAPSYSTEM ) não é 01 . Isso pode diferir em outros ambientes e deve ser alterado em conformidade.
|
Nome da caixa: PostCloneVolumes
Durante esta etapa, as propriedades personalizadas ClonePostFix
e SnapPostFix
a configuração do ponto de montagem para o sistema de destino são mantidas.
As propriedades personalizadas são usadas posteriormente como entrada quando o sistema é desativado durante a ServiceConfigRemoval
fase ou ClearMountConfig
. O sistema foi projetado para preservar as configurações dos parâmetros personalizados que foram especificados durante o fluxo de trabalho de provisionamento do sistema.
Os valores utilizados neste exemplo são ClonePostFix=_clone_20221115
e SnapPostFix=_snap_20221115
.
Para o volume HN9_sap
, o arquivo Ansible criado dinamicamente inclui os seguintes valores datavolumename
: : HN9_sap
, snapshotpostfix: _snap_20221115
E clonepostfix: _clone_20221115
.
O que leva ao nome do snapshot no volume HN9_sap HN9_sap_snap_20221115
e ao nome do clone de volume criado HN9_sap_clone_20221115
.
Propriedades personalizadas podem ser usadas de qualquer forma para preservar os parâmetros usados durante o processo de provisionamento. |
A configuração do ponto de montagem é extraída do arquivo XML que foi entregue pelo Lama CloneVolume
na etapa. O ClonePostFix
é adicionado aos nomes de volume e enviado de volta ao Lama através da saída de script padrão. A funcionalidade é descrita em "SAP Nota 1889590".
Neste exemplo, qtrees no sistema de armazenamento são usados como uma maneira comum de colocar dados diferentes em um único volume. Por exemplo, HN9_sap mantém os pontos de montagem para /usr/sap/HN9 /sapmnt/HN9 , /home/hn9adm e . Os subdiretórios funcionam da mesma forma. Isso pode diferir em outros ambientes e deve ser alterado em conformidade.
|
HookOperationName: ServiceConfigRemoval
Nessa etapa, o manual de estratégia do Ansible responsável pela exclusão dos clones de volume está sendo executado.
Os nomes de volume são entregues pelo SAP lama através do arquivo de configuração de montagem e as propriedades personalizadas ClonePostFix
e SnapPostFix
são usados para entregar os valores dos parâmetros originalmente especificados durante o fluxo de trabalho de provisionamento do sistema (consulte a nota em HookOperationName = PostCloneVolumes
).
Os nomes de volume são extraídos do arquivo xml, e o manual de estratégia de clonagem do Ansible é executado para cada volume.
Neste exemplo, a instância AS e os serviços centrais compartilham o mesmo volume. Portanto, a exclusão de volume só é executada quando o número da instância SAP ($SAPSYSTEM ) não é 01 . Isso pode diferir em outros ambientes e deve ser alterado em conformidade.
|
Nome da conexão: ClearMountConfig
Nessa etapa, o manual do Ansible, responsável pela exclusão dos clones de volume durante um fluxo de trabalho de atualização do sistema, está sendo executado.
Os nomes de volume são entregues pelo SAP lama através do arquivo de configuração de montagem e as propriedades personalizadas ClonePostFix
e SnapPostFix
são usados para entregar os valores dos parâmetros originalmente especificados durante o fluxo de trabalho de provisionamento do sistema.
Os nomes de volume são extraídos do arquivo XML e o manual de estratégia de clonagem do Ansible é executado para cada volume.
Neste exemplo, a instância AS e os serviços centrais compartilham o mesmo volume. Portanto, a exclusão de volume só é executada quando o número da instância SAP ($SAPSYSTEM ) não é 01 . Isso pode diferir em outros ambientes e deve ser alterado em conformidade.
|
root@sap-jump:~# cat /usr/sap/scripts/netapp_clone.sh #!/bin/bash #Section - Variables ######################################### VERSION="Version 0.9" #Path for ansible play-books ANSIBLE_PATH=/usr/sap/scripts/ansible #Values for Ansible Inventory File PRIMARY_CLUSTER=grenada PRIMARY_SVM=svm-sap01 PRIMARY_KEYFILE=/usr/sap/scripts/ansible/certs/ontap.key PRIMARY_CERTFILE=/usr/sap/scripts/ansible/certs/ontap.pem #Default Variable if PARAM ClonePostFix / SnapPostFix is not maintained in LaMa DefaultPostFix=_clone_1 #TMP Files - used during execution YAML_TMP=/tmp/inventory_ansible_clone_tmp_$$.yml TMPFILE=/tmp/tmpfile.$$ MY_NAME="`basename $0`" BASE_SCRIPT_DIR="`dirname $0`" #Sendig Script Version and run options to LaMa Log echo "[DEBUG]: Running Script $MY_NAME $VERSION" echo "[DEBUG]: $MY_NAME $@" #Command declared in the netapp_clone.conf Provider definition #Command: /usr/sap/scripts/netapp_clone.sh --HookOperationName=$[HookOperationName] --SAPSYSTEMNAME=$[SAPSYSTEMNAME] --SAPSYSTEM=$[SAPSYSTEM] --MOUNT_XML_PATH=$[MOUNT_XML_PATH] --PARAM_ClonePostFix=$[PARAM-ClonePostFix] --PARAM_SnapPostFix=$[PARAM-SnapPostFix] --PROP_ClonePostFix=$[PROP-ClonePostFix] --PROP_SnapPostFix=$[PROP-SnapPostFix] --SAP_LVM_SRC_SID=$[SAP_LVM_SRC_SID] --SAP_LVM_TARGET_SID=$[SAP_LVM_TARGET_SID] #Reading Input Variables hand over by LaMa for i in "$@" do case $i in --HookOperationName=*) HookOperationName="${i#*=}";shift;; --SAPSYSTEMNAME=*) SAPSYSTEMNAME="${i#*=}";shift;; --SAPSYSTEM=*) SAPSYSTEM="${i#*=}";shift;; --MOUNT_XML_PATH=*) MOUNT_XML_PATH="${i#*=}";shift;; --PARAM_ClonePostFix=*) PARAM_ClonePostFix="${i#*=}";shift;; --PARAM_SnapPostFix=*) PARAM_SnapPostFix="${i#*=}";shift;; --PROP_ClonePostFix=*) PROP_ClonePostFix="${i#*=}";shift;; --PROP_SnapPostFix=*) PROP_SnapPostFix="${i#*=}";shift;; --SAP_LVM_SRC_SID=*) SAP_LVM_SRC_SID="${i#*=}";shift;; --SAP_LVM_TARGET_SID=*) SAP_LVM_TARGET_SID="${i#*=}";shift;; *) # unknown option ;; esac done #If Parameters not provided by the User - defaulting to DefaultPostFix if [ -z $PARAM_ClonePostFix ]; then PARAM_ClonePostFix=$DefaultPostFix;fi if [ -z $PARAM_SnapPostFix ]; then PARAM_SnapPostFix=$DefaultPostFix;fi #Section - Functions ######################################### #Function Create (Inventory) YML File ######################################### create_yml_file() { echo "ontapservers:">$YAML_TMP echo " hosts:">>$YAML_TMP echo " ${PRIMARY_CLUSTER}:">>$YAML_TMP echo " ansible_host: "'"'$PRIMARY_CLUSTER'"'>>$YAML_TMP echo " keyfile: "'"'$PRIMARY_KEYFILE'"'>>$YAML_TMP echo " certfile: "'"'$PRIMARY_CERTFILE'"'>>$YAML_TMP echo " svmname: "'"'$PRIMARY_SVM'"'>>$YAML_TMP echo " datavolumename: "'"'$datavolumename'"'>>$YAML_TMP echo " snapshotpostfix: "'"'$snapshotpostfix'"'>>$YAML_TMP echo " clonepostfix: "'"'$clonepostfix'"'>>$YAML_TMP } #Function run ansible-playbook ######################################### run_ansible_playbook() { echo "[DEBUG]: Running ansible playbook netapp_lama_${HookOperationName}.yml on Volume $datavolumename" ansible-playbook -i $YAML_TMP $ANSIBLE_PATH/netapp_lama_${HookOperationName}.yml } #Section - Main ######################################### #HookOperationName – CloneVolumes ######################################### if [ $HookOperationName = CloneVolumes ] ;then #save mount xml for later usage - used in Section FinalizeCloneVolues to generate the mountpoints echo "[DEBUG]: saving mount config...." cp $MOUNT_XML_PATH /tmp/mount_config_${SAPSYSTEMNAME}_${SAPSYSTEM}.xml #Instance 00 + 01 share the same volumes - clone needs to be done once if [ $SAPSYSTEM != 01 ]; then #generating Volume List - assuming usage of qtrees - "IP-Adress:/VolumeName/qtree" xmlFile=/tmp/mount_config_${SAPSYSTEMNAME}_${SAPSYSTEM}.xml if [ -e $TMPFILE ];then rm $TMPFILE;fi numMounts=`xml_grep --count "/mountconfig/mount" $xmlFile | grep "total: " | awk '{ print $2 }'` i=1 while [ $i -le $numMounts ]; do xmllint --xpath "/mountconfig/mount[$i]/exportpath/text()" $xmlFile |awk -F"/" '{print $2}' >>$TMPFILE i=$((i + 1)) done DATAVOLUMES=`cat $TMPFILE |sort -u` #Create yml file and rund playbook for each volume for I in $DATAVOLUMES; do datavolumename="$I" snapshotpostfix="$PARAM_SnapPostFix" clonepostfix="$PARAM_ClonePostFix" create_yml_file run_ansible_playbook done else echo "[DEBUG]: Doing nothing .... Volume cloned in different Task" fi fi #HookOperationName – PostCloneVolumes ######################################### if [ $HookOperationName = PostCloneVolumes] ;then #Reporting Properties back to LaMa Config for Cloned System echo "[RESULT]:Property:ClonePostFix=$PARAM_ClonePostFix" echo "[RESULT]:Property:SnapPostFix=$PARAM_SnapPostFix" #Create MountPoint Config for Cloned Instances and report back to LaMa according to SAP Note: https://launchpad.support.sap.com/#/notes/1889590 echo "MountDataBegin" echo '<?xml version="1.0" encoding="UTF-8"?>' echo "<mountconfig>" xmlFile=/tmp/mount_config_${SAPSYSTEMNAME}_${SAPSYSTEM}.xml numMounts=`xml_grep --count "/mountconfig/mount" $xmlFile | grep "total: " | awk '{ print $2 }'` i=1 while [ $i -le $numMounts ]; do MOUNTPOINT=`xmllint --xpath "/mountconfig/mount[$i]/mountpoint/text()" $xmlFile`; EXPORTPATH=`xmllint --xpath "/mountconfig/mount[$i]/exportpath/text()" $xmlFile`; OPTIONS=`xmllint --xpath "/mountconfig/mount[$i]/options/text()" $xmlFile`; #Adopt Exportpath and add Clonepostfix - assuming usage of qtrees - "IP-Adress:/VolumeName/qtree" TMPFIELD1=`echo $EXPORTPATH|awk -F":/" '{print $1}'` TMPFIELD2=`echo $EXPORTPATH|awk -F"/" '{print $2}'` TMPFIELD3=`echo $EXPORTPATH|awk -F"/" '{print $3}'` EXPORTPATH=$TMPFIELD1":/"${TMPFIELD2}$PARAM_ClonePostFix"/"$TMPFIELD3 echo -e '\t<mount fstype="nfs" storagetype="NETFS">' echo -e "\t\t<mountpoint>${MOUNTPOINT}</mountpoint>" echo -e "\t\t<exportpath>${EXPORTPATH}</exportpath>" echo -e "\t\t<options>${OPTIONS}</options>" echo -e "\t</mount>" i=$((i + 1)) done echo "</mountconfig>" echo "MountDataEnd" #Finished MountPoint Config #Cleanup Temporary Files rm $xmlFile fi #HookOperationName – ServiceConfigRemoval ######################################### if [ $HookOperationName = ServiceConfigRemoval ] ;then #Assure that Properties ClonePostFix and SnapPostfix has been configured through the provisioning process if [ -z $PROP_ClonePostFix ]; then echo "[ERROR]: Propertiy ClonePostFix is not handed over - please investigate";exit 5;fi if [ -z $PROP_SnapPostFix ]; then echo "[ERROR]: Propertiy SnapPostFix is not handed over - please investigate";exit 5;fi #Instance 00 + 01 share the same volumes - clone delete needs to be done once if [ $SAPSYSTEM != 01 ]; then #generating Volume List - assuming usage of qtrees - "IP-Adress:/VolumeName/qtree" xmlFile=$MOUNT_XML_PATH if [ -e $TMPFILE ];then rm $TMPFILE;fi numMounts=`xml_grep --count "/mountconfig/mount" $xmlFile | grep "total: " | awk '{ print $2 }'` i=1 while [ $i -le $numMounts ]; do xmllint --xpath "/mountconfig/mount[$i]/exportpath/text()" $xmlFile |awk -F"/" '{print $2}' >>$TMPFILE i=$((i + 1)) done DATAVOLUMES=`cat $TMPFILE |sort -u| awk -F $PROP_ClonePostFix '{ print $1 }'` #Create yml file and rund playbook for each volume for I in $DATAVOLUMES; do datavolumename="$I" snapshotpostfix="$PROP_SnapPostFix" clonepostfix="$PROP_ClonePostFix" create_yml_file run_ansible_playbook done else echo "[DEBUG]: Doing nothing .... Volume deleted in different Task" fi #Cleanup Temporary Files rm $xmlFile fi #HookOperationName - ClearMountConfig ######################################### if [ $HookOperationName = ClearMountConfig ] ;then #Assure that Properties ClonePostFix and SnapPostfix has been configured through the provisioning process if [ -z $PROP_ClonePostFix ]; then echo "[ERROR]: Propertiy ClonePostFix is not handed over - please investigate";exit 5;fi if [ -z $PROP_SnapPostFix ]; then echo "[ERROR]: Propertiy SnapPostFix is not handed over - please investigate";exit 5;fi #Instance 00 + 01 share the same volumes - clone delete needs to be done once if [ $SAPSYSTEM != 01 ]; then #generating Volume List - assuming usage of qtrees - "IP-Adress:/VolumeName/qtree" xmlFile=$MOUNT_XML_PATH if [ -e $TMPFILE ];then rm $TMPFILE;fi numMounts=`xml_grep --count "/mountconfig/mount" $xmlFile | grep "total: " | awk '{ print $2 }'` i=1 while [ $i -le $numMounts ]; do xmllint --xpath "/mountconfig/mount[$i]/exportpath/text()" $xmlFile |awk -F"/" '{print $2}' >>$TMPFILE i=$((i + 1)) done DATAVOLUMES=`cat $TMPFILE |sort -u| awk -F $PROP_ClonePostFix '{ print $1 }'` #Create yml file and rund playbook for each volume for I in $DATAVOLUMES; do datavolumename="$I" snapshotpostfix="$PROP_SnapPostFix" clonepostfix="$PROP_ClonePostFix" create_yml_file run_ansible_playbook done else echo "[DEBUG]: Doing nothing .... Volume deleted in different Task" fi #Cleanup Temporary Files rm $xmlFile fi #Cleanup ######################################### #Cleanup Temporary Files if [ -e $TMPFILE ];then rm $TMPFILE;fi if [ -e $YAML_TMP ];then rm $YAML_TMP;fi exit 0
Ansible Playbook NetApp_lama_CloneVolumes.yml
O manual de estratégia que é executado durante a etapa CloneVolumes do fluxo de trabalho clone do sistema lama é uma combinação create_snapshot.yml
de e create_clone.yml
(consulte "Módulos do NetApp Ansible - arquivos YAML"). Esse manual de estratégia pode ser facilmente estendido para cobrir casos de uso adicionais, como clonagem de operações secundárias e de divisão de clones.
root@sap-jump:~# cat /usr/sap/scripts/ansible/netapp_lama_CloneVolumes.yml --- - hosts: ontapservers connection: local collections: - netapp.ontap gather_facts: false name: netapp_lama_CloneVolumes tasks: - name: Create SnapShot na_ontap_snapshot: state: present snapshot: "{{ datavolumename }}{{ snapshotpostfix }}" use_rest: always volume: "{{ datavolumename }}" vserver: "{{ svmname }}" hostname: "{{ inventory_hostname }}" cert_filepath: "{{ certfile }}" key_filepath: "{{ keyfile }}" https: true validate_certs: false - name: Clone Volume na_ontap_volume_clone: state: present name: "{{ datavolumename }}{{ clonepostfix }}" use_rest: always vserver: "{{ svmname }}" junction_path: '/{{ datavolumename }}{{ clonepostfix }}' parent_volume: "{{ datavolumename }}" parent_snapshot: "{{ datavolumename }}{{ snapshotpostfix }}" hostname: "{{ inventory_hostname }}" cert_filepath: "{{ certfile }}" key_filepath: "{{ keyfile }}" https: true validate_certs: false
Manual de instruções do Ansible NetApp_lama_ServiceConfigRemoval.yml
O manual de estratégia que é executado durante ServiceConfigRemoval
a fase do fluxo de trabalho de destruição do sistema Lama é uma combinação delete_clone.yml
de e delete_snapshot.yml
(consulte "Módulos do NetApp Ansible - arquivos YAML"). Ela deve estar alinhada às etapas de execução do netapp_lama_CloneVolumes
manual de estratégia.
root@sap-jump:~# cat /usr/sap/scripts/ansible/netapp_lama_ServiceConfigRemoval.yml --- - hosts: ontapservers connection: local collections: - netapp.ontap gather_facts: false name: netapp_lama_ServiceConfigRemoval tasks: - name: Delete Clone na_ontap_volume: state: absent name: "{{ datavolumename }}{{ clonepostfix }}" use_rest: always vserver: "{{ svmname }}" wait_for_completion: True hostname: "{{ inventory_hostname }}" cert_filepath: "{{ certfile }}" key_filepath: "{{ keyfile }}" https: true validate_certs: false - name: Delete SnapShot na_ontap_snapshot: state: absent snapshot: "{{ datavolumename }}{{ snapshotpostfix }}" use_rest: always volume: "{{ datavolumename }}" vserver: "{{ svmname }}" hostname: "{{ inventory_hostname }}" cert_filepath: "{{ certfile }}" key_filepath: "{{ keyfile }}" https: true validate_certs: false root@sap-jump:~#
Manual do Ansible NetApp_lama_ClearMountConfig.yml
O manual de estratégia, que é executado durante netapp_lama_ClearMountConfig
a fase do fluxo de trabalho de atualização do sistema lama, é uma combinação delete_clone.yml
de e delete_snapshot.yml
(consulte "Módulos do NetApp Ansible - arquivos YAML"). Ela deve estar alinhada às etapas de execução do netapp_lama_CloneVolumes
manual de estratégia.
root@sap-jump:~# cat /usr/sap/scripts/ansible/netapp_lama_ServiceConfigRemoval.yml --- - hosts: ontapservers connection: local collections: - netapp.ontap gather_facts: false name: netapp_lama_ServiceConfigRemoval tasks: - name: Delete Clone na_ontap_volume: state: absent name: "{{ datavolumename }}{{ clonepostfix }}" use_rest: always vserver: "{{ svmname }}" wait_for_completion: True hostname: "{{ inventory_hostname }}" cert_filepath: "{{ certfile }}" key_filepath: "{{ keyfile }}" https: true validate_certs: false - name: Delete SnapShot na_ontap_snapshot: state: absent snapshot: "{{ datavolumename }}{{ snapshotpostfix }}" use_rest: always volume: "{{ datavolumename }}" vserver: "{{ svmname }}" hostname: "{{ inventory_hostname }}" cert_filepath: "{{ certfile }}" key_filepath: "{{ keyfile }}" https: true validate_certs: false root@sap-jump:~#
Exemplo de inventário do Ansible.yml
Este arquivo de inventário é dinamicamente construído durante a execução do fluxo de trabalho, e só é mostrado aqui para ilustração.
ontapservers: hosts: grenada: ansible_host: "grenada" keyfile: "/usr/sap/scripts/ansible/certs/ontap.key" certfile: "/usr/sap/scripts/ansible/certs/ontap.pem" svmname: "svm-sap01" datavolumename: "HN9_sap" snapshotpostfix: " _snap_20221115" clonepostfix: "_clone_20221115"