プロバイダスクリプトの設定とAnsibleのプレイブック
このドキュメントの導入例とワークフローの実行時には、次のプロバイダ構成ファイル、実行スクリプト、およびAnsibleプレイブックを使用します。
このサンプルスクリプトは現状のまま提供されており、ネットアップではサポートしていません。スクリプトの最新バージョンは、mailto:ng-sapcc@netapp.com [ng-sapcc@netapp.com ^]にEメールでリクエストできます。 |
プロバイダ構成ファイルNetApp_clone.conf
構成ファイルは、の説明に従って作成されます "SAP LaMaドキュメント-「Configuring SAP Host Agent Registered Scripts"。この構成ファイルは、SAPホストエージェントがインストールされているAnsibleコントロールノードに配置する必要があります。
設定されているos-user sapuser
スクリプトおよび呼び出されたAnsibleプレイブックを実行するための適切な権限が必要です。このスクリプトは共通のスクリプトディレクトリに配置できます。SAP LaMaは、スクリプトを呼び出す際に複数のパラメータを提供します。
カスタムパラメータに加えて、 PARAM_ClonePostFix
、 PROP_ClonePostFix
、 `PARAM_ClonePostFix`および `PROP_ClonePostFix`に示されているように、他の多くは手渡されることができる "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
プロバイダスクリプトnetapp_clone.sh
プロバイダスクリプトはに保存する必要があります /usr/sap/scripts
プロバイダの構成ファイルで設定されているとおりです。
変数( variables )
次の変数はスクリプトでハードコードされており、適宜変更する必要があります。
-
PRIMARY_CLUSTER=
<hostname of netapp cluster> -
PRIMARY_SVM=
<SVM name where source system volumes are stored>
証明書ファイル PRIMARY_KEYFILE=/usr/sap/scripts/ansible/certs/ontap.key
および PRIMARY_CERTFILE=/usr/sap/scripts/ansible/certs/ontap.pem
の説明に従って指定する必要があります "NetApp Ansibleモジュール- ONTAP を準備"。
それぞれのSAPシステムで異なるクラスタやSVMが必要な場合は、SAP LaMaプロバイダ定義のパラメータとして追加できます。 |
機能:インベントリファイルを作成する
Ansibleプレイブックをより動的に実行するために、を使用します inventory. yml
その場でファイルが作成されます。一部の静的値は変数セクションで設定され、一部は実行中に動的に作成されます。
関数:Ansibleプレイブックを実行する
この関数は、Ansibleプレイブックと動的に作成されるを実行するために使用します inventory.yml
ファイル。プレイブックの命名規則はです netapp_lama_${HookOperationName}.yml
。の値 ${HookOperationName}
LaMaの運用に依存し、LaMaをコマンドラインパラメータとして引き継ぎます。
セクションMain
ここでは、主な実行計画について説明します。変数 ${HookOperationName}
LaMaの代替手順の名前が含まれ、スクリプトが呼び出されるとLaMaによって提供されます。
-
システムクローンとシステムコピーのプロビジョニングワークフローを使用した値:
-
CloneVolumes
-
CloneVolumes
-
-
system destroyワークフローを使用した値:
-
ServiceConfigRemovalサービス構成の削除
-
-
システムの更新ワークフローによる値:
-
ClearMountConfigの場合
-
HookOperationName=CloneVolumes
この手順では、Ansibleプレイブックが実行され、Snapshotコピーとクローニングの処理が開始されます。ボリューム名とマウント設定は、変数で定義されたXMLファイルを使用してSAP LaMaによって引き継がれます $MOUNT_XML_PATH
。このファイルは、あとで手順で使用するために保存されます FinalizeCloneVolumes
新しいマウントポイント設定を作成します。ボリューム名がXMLファイルから抽出され、各ボリュームに対してAnsibleのクローニングプレイブックが実行されます。
この例では、ASインスタンスと中央サービスは同じボリュームを共有します。したがって、ボリュームクローニングはSAPインスタンス番号でのみ実行されます ($SAPSYSTEM )はではありません 01 。これは他の環境とは異なる場合があるため、変更する必要があります。
|
HookOperationName=PostCloneVolumes
このステップでは、ユーザー定義プロパティを指定します ClonePostFix
および SnapPostFix
また、ターゲットシステムのマウントポイント設定が保持されます。
カスタムプロパティは、あとでででの運用停止時に入力として使用されます ServiceConfigRemoval
または ClearMountConfig
フェーズ:システムのプロビジョニングワークフローで指定されたカスタムパラメータの設定を保持するように設計されています。
この例で使用されている値はです ClonePostFix=_clone_20221115
および SnapPostFix=_snap_20221115
。
ボリューム HN9_sap`は、動的に作成されるAnsibleファイルに次の値が含まれています。 `datavolumename
: HN9_sap
、 snapshotpostfix: _snap_20221115`および `clonepostfix: _clone_20221115
。
これにより、ボリュームHN9_SAP上のSnapshot名に変換されます HN9_sap_snap_20221115
作成されたボリュームクローンの名前も表示されます HN9_sap_clone_20221115
。
カスタムプロパティを使用すると、プロビジョニングプロセスで使用されるパラメータを保持できます。 |
マウントポイントの設定は、でLaMaに引き継がれたXMLファイルから抽出されます CloneVolume
ステップ。。 ClonePostFix
がボリューム名に追加され、デフォルトのスクリプト出力でLaMaに返信されます。機能については、を参照してください "SAPノート1889590"。
この例では、ストレージシステム上のqtreeを、単一のボリュームに異なるデータを配置する一般的な方法として使用します。例: HN9_sap のマウントポイントを保持します /usr/sap/HN9 、 /sapmnt/HN9`および `/home/hn9adm 。サブディレクトリも同様に機能します。これは他の環境とは異なる場合があるため、変更する必要があります。
|
HookOperationName = ServiceConfigRemoval
この手順では、ボリュームクローンの削除を実行するAnsibleプレイブックを使用します。
ボリューム名は、マウント構成ファイルとカスタムプロパティを通じてSAP LaMaから引き継がれます ClonePostFix
および SnapPostFix
は、システムプロビジョニングワークフローで最初に指定されたパラメータの値を渡すために使用します(の注を参照) HookOperationName = PostCloneVolumes
)。
ボリューム名がXMLファイルから抽出され、各ボリュームに対してAnsibleのクローニングプレイブックが実行されます。
この例では、ASインスタンスと中央サービスは同じボリュームを共有します。そのため、ボリュームの削除はSAPインスタンス番号がの場合にのみ実行されます ($SAPSYSTEM )はではありません 01 。これは他の環境とは異なる場合があるため、変更する必要があります。
|
HookOperationName=ClearMountConfig
この手順では、システムの更新ワークフロー中にボリュームクローンを削除するAnsibleプレイブックを実行します。
ボリューム名は、マウント構成ファイルとカスタムプロパティを通じてSAP LaMaから引き継がれます ClonePostFix
および SnapPostFix
は、システムプロビジョニングワークフローで最初に指定されたパラメータの値を渡すために使用します。
ボリューム名がXMLファイルから抽出され、各ボリュームに対してAnsibleのクローニングプレイブックが実行されます。
この例では、ASインスタンスと中央サービスは同じボリュームを共有します。そのため、ボリュームの削除はSAPインスタンス番号がの場合にのみ実行されます ($SAPSYSTEM )はではありません 01 。これは他の環境とは異なる場合があるため、変更する必要があります。
|
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 _CloneVolume.yml
LaMaシステムのクローニングワークフローのCloneVolumesの手順で実行されるPlaybookは、を組み合わせたものです create_snapshot.yml
および create_clone.yml
(を参照) "NetApp Ansibleモジュール- YAMLファイル")。このプレイブックは、セカンダリからのクローニング処理やクローンスプリット処理など、他のユースケースにも簡単に対応できます。
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
Ansible Playbook:NetApp_LaMa _ServiceConfigRemoval.yml
実行されるプレイブック ServiceConfigRemoval
LaMaシステムの破棄ワークフローのフェーズは、のフェーズです delete_clone.yml
および delete_snapshot.yml
(を参照) "NetApp Ansibleモジュール- YAMLファイル")。の実行ステップに合わせて調整する必要があります netapp_lama_CloneVolumes
Playbook:
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:~#
Ansible Playbook:NetApp_LaMa _ClearMountConfig.yml
プレイブックは、の実行時に指定します netapp_lama_ClearMountConfig
LaMaシステムの更新ワークフローのフェーズは、のフェーズです delete_clone.yml
および delete_snapshot.yml
(を参照) "NetApp Ansibleモジュール- YAMLファイル")。の実行ステップに合わせて調整する必要があります netapp_lama_CloneVolumes
Playbook:
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:~#
Ansibleのinventory.ymlの例
このインベントリファイルは、ワークフローの実行時に動的に作成されます。このファイルは、説明のためにのみここに表示されています。
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"