[Exalogic] Exalogic 2.0.1 Tea Break Snippets - Scripting Asset Creation

原文はこちら。
https://blogs.oracle.com/ATeamExalogic/entry/exalogic_2_0_1_tea6

これまでのところ、このシリーズでは、我々はEMOC(Enterprise Manager Ops Center)のBUI(Browser-based User Interface)でのアセットの作成を取り上げてきました。しかし、Exalogic2.0.1のインストールソフトウェアでは、EMOC内で利用可能な一般的な機能のほとんどに代わるものとして、IaaSのCLIを提供しています。IaaSのCLIインタフェースはCloudUserロールを持つBUIログインユーザーに対して利用可能な機能にアクセスを提供しています。

しかしそうは言っても、このような機能がCLIから全て利用できるわけではないので、IaaS CLIはAssetsを特定のアカウント(Tenure)内で作成するために必要な機能を全て提供しています。これらのアクションは一般的でかつ繰り返すことができるので、私は、シンプルな入力ファイルを取り、アセットを作成するという簡単なスクリプトに機能をラップすることにしました。

スクリプトに従えば、私たちにアカウント内に様々なアセットを作成するための手順が表示されるので、手順を説明する以下のスクリプト内の様々な機能を使って処理します。

スクリプト内の様々な手順から、進行中のアクションを完了させるアクション間で停止するように設計されていることに気付くでしょう。このようにしている理由は、一連のアクションの中でEMOCの動作を困難にする可能性があり、我々は行動のvServerやボリュームの作成が完了する前にボリュームを接続しようとしている状況に陥る可能性があるからです。

processAssets()

この関数は、単にどんなアセットを作成する必要があるかを識別するための入力ファイルを読み取ります。入力ファイルの例を以下に記載します。これは、入力ファイルを使って1回の実行で複数のアカウント内に資産を作成できることがわかります。エントリの順序は次のように実行される関数を定義します。

入力コマンド IaaSアクション 引数
Production:Connect
  1. akm-describe-accounts
  2. akm-create-access-key
  3. iaas-create-key-pair
  4. iaas-describe-vnets
  5. iaas-describe-vserver-types
  6. iaas-describe-server-templates
  1. ユーザ名
  2. パスワード
Production:Create|vServer
  1. iaas-run-vserver
  1. vServer名
  2. vServerタイプ名
  3. テンプレート名
  4. vServerが接続するネットワーク名のリスト(コンマ区切り)
  5. 個別のネットワークのIPアドレスのリスト(コンマ区切り)
Production:Create|Volume
  1. iaas-create-volume
  1. ボリューム名
  2. ボリュームサイズ
Production:Attach|Volume
  1. iaas-attach-volumes-to-vserver
  1. vServer名
  2. ボリューム名のリスト(コンマ区切り)
Production:Disconnect
  1. iaas-delete-key-pair
  2. akm-delete-access-key
なし

connectToAccount()

connectToAccount()関数から、アセット作成の前にまず適切なアカウントに接続する必要があることがわかります。これを実現するためには、アカウントに関連付けられているIDが必要になります。akm-describe-accounts CLIコマンドを実行することで入手できます。このコマンドは全てのアカウントとIDをリストとして返します。アカウントIDがわかると、akm-create-access-keyコマンドを使ってアクセスキーを生成し、iaas-create-key-pairコマンドを使ってキーペアを生成します。

この時点で、我々は今、我々は特定の名前のアカウントにアクセスするために必要なすべての情報を持っています。

createVServer()

この関数は入力ファイルから情報を抽出し、iaas-run-vserverというCLIコマンドを使ってcServerを作成します。この関数の中身を読むと、vServerタイプ、テンプレート、ネットワークに対応する様々な入力名をとり、それらを適切なIDに変換することがわかるでしょう。このIaaS CLIはコンポーネント名で直接指示できないため、全てのIDを見つけ出す必要があります。

createVolume()

単にボリューム名とサイズを入力パラメータとし、iaas-create-volumeコマンドを実行してボリュームを作成する関数です。

attachVolume()

いま作成したところのボリューム名を引数とし、 iaas-attach-volumes-to-vserverを使ってボリュームをvServerに割り当てる前にボリュームが適切なIDを識別します。

disconnectFromAccount()

アカウントへの接続が終了すると、単にキーペアをiaas-delete-key-pairで削除し、アクセスキーをakm-delete-access-keyで削除すればよいのですが、もしSSHが必要でその後セキュアでないアクセスを許可するためにSSHDの情報を変更しない場合、キーを保持することが有用な場合があります。デフォルトでは、vServerをコマンドラインから作成する場合は、SSHアクセスのためにキーが必要です。

CreateAssets.sh

export OCCLI=/opt/sun/occli/bin
export IAAS_HOME=/opt/oracle/iaas/cli
export JAVA_HOME=/usr/java/latest
export IAAS_BASE_URL=https://127.0.0.1
export IAAS_ACCESS_KEY_FILE=iaas_access.key
export KEY_FILE=iaas_access.pub
#CloudUser used to create vServers & Volumes
export IAAS_USER=exaprod
export IAAS_PASSWORD_FILE=root.pwd
export KEY_NAME=cli.recreate
export INPUT_FILE=CreateAssets.in

export ACCOUNTS_FILE=accounts.out
export VOLUMES_FILE=volumes.out
export DISTGRPS_FILE=distgrp.out
export VNETS_FILE=vnets.out
export VSERVER_TYPES_FILE=vstype.out
export VSERVER_FILE=vserver.out
export VSERVER_TEMPLATES=template.out
export KEY_PAIRS=keypairs.out

PROCESSING_ACCOUNT=""

function cleanTempFiles() {
rm -f $ACCOUNTS_FILE $VOLUMES_FILE $DISTGRPS_FILE $VNETS_FILE $VSERVER_TYPES_FILE $VSERVER_FILE $VSERVER_TEMPLATES $KEY_PAIRS $IAAS_PASSWORD_FILE $KEY_FILE $IAAS_ACCESS_KEY_FILE
}

function connectToAccount() {
if [[ "$ACCOUNT" != "$PROCESSING_ACCOUNT" ]]
then
if [[ "" != "$PROCESSING_ACCOUNT" ]]
then
$IAAS_HOME/bin/iaas-delete-key-pair --key-name $KEY_NAME --access-key-file $IAAS_ACCESS_KEY_FILE
$IAAS_HOME/bin/akm-delete-access-key $AK
fi
PROCESSING_ACCOUNT=$ACCOUNT
IAAS_USER=$ACCOUNT_USER
echo "$ACCOUNT_PASSWORD" > $IAAS_PASSWORD_FILE
$IAAS_HOME/bin/akm-describe-accounts --sep "|" > $ACCOUNTS_FILE
while read line
do
ACCOUNT_ID=${line%%|*}
line=${line#*|}
ACCOUNT_NAME=${line%%|*}
#               echo "Id = $ACCOUNT_ID"
#               echo "Name = $ACCOUNT_NAME"
if [[ "$ACCOUNT_NAME" == "$ACCOUNT" ]]
then
echo "Found Production Account $line"
AK=`$IAAS_HOME/bin/akm-create-access-key --account $ACCOUNT_ID --access-key-file $IAAS_ACCESS_KEY_FILE`
KEYPAIR=`$IAAS_HOME/bin/iaas-create-key-pair --key-name $KEY_NAME --key-file $KEY_FILE`
echo "Connected to $ACCOUNT_NAME"
break
fi
done < $ACCOUNTS_FILE
fi
}

function disconnectFromAccount() {
$IAAS_HOME/bin/iaas-delete-key-pair --key-name $KEY_NAME --access-key-file $IAAS_ACCESS_KEY_FILE
$IAAS_HOME/bin/akm-delete-access-key $AK
PROCESSING_ACCOUNT=""
}

function getNetworks() {
$IAAS_HOME/bin/iaas-describe-vnets --sep "|" > $VNETS_FILE
}

function getVSTypes() {
$IAAS_HOME/bin/iaas-describe-vserver-types --sep "|" > $VSERVER_TYPES_FILE
}

function getTemplates() {
$IAAS_HOME/bin/iaas-describe-server-templates --sep "|" > $VSERVER_TEMPLATES
}

function getVolumes() {
$IAAS_HOME/bin/iaas-describe-volumes --sep "|" > $VOLUMES_FILE
}

function getVServers() {
$IAAS_HOME/bin/iaas-describe-vservers --sep "|" > $VSERVER_FILE
}

function getNetworkId() {
while read line
do
NETWORK_ID=${line%%|*}
line=${line#*|}
NAME=${line%%|*}
if [[ "$NAME" == "$NETWORK_NAME" ]]
then
break
fi
done < $VNETS_FILE
}

function getVSTypeId() {
while read line
do
VSTYPE_ID=${line%%|*}
line=${line#*|}
NAME=${line%%|*}
if [[ "$VSTYPE_NAME" == "$NAME" ]]
then
break
fi
done < $VSERVER_TYPES_FILE
}

function getTemplateId() {
while read line
do
TEMPLATE_ID=${line%%|*}
line=${line#*|}
NAME=${line%%|*}
if [[ "$TEMPLATE_NAME" == "$NAME" ]]
then
break
fi
done < $VSERVER_TEMPLATES
}

function getVolumeId() {
while read line
do
export VOLUME_ID=${line%%|*}
line=${line#*|}
NAME=${line%%|*}
if [[ "$NAME" == "$VOLUME_NAME" ]]
then
break;
fi
done < $VOLUMES_FILE
}

function getVServerId() {
while read line
do
VSERVER_ID=${line%%|*}
line=${line#*|}
NAME=${line%%|*}
if [[ "$VSERVER_NAME" == "$NAME" ]]
then
break;
fi
done < $VSERVER_FILE
}

function getVServerState() {
getVServers
while read line
do
VSERVER_ID=${line%%|*}
line=${line#*|}
NAME=${line%%|*}
line=${line#*|}
line=${line#*|}
VSERVER_STATE=${line%%|*}
if [[ "$VSERVER_NAME" == "$NAME" ]]
then
break;
fi
done < $VSERVER_FILE
}

function pauseUntilVServerRunning() {
# Wait until the Server is running before creating the next
getVServerState
while [[ "$VSERVER_STATE" != "RUNNING" ]]
do
getVServerState
echo "$NAME $VSERVER_STATE"
if [[ "$VSERVER_STATE" != "RUNNING" ]]
then
echo "Sleeping......."
sleep 60
fi
if [[ "$VSERVER_STATE" == "FAILED" ]]
then
echo "Will Delete $NAME in 5 Minutes....."
sleep 300
deleteVServer
echo "Deleted $NAME waiting 5 Minutes....."
sleep 300
break
fi
done
# Lets pause for a minute or two
echo "Just Chilling......"
sleep 60
echo "Ahhhhh we're getting there......."
sleep 60
echo "I'm almost at one with the universe......."
sleep 60
echo "Bong Reality Check !"
}

function deleteVServer() {
$IAAS_HOME/bin/iaas-terminate-vservers --force --vserver-ids $VSERVER_ID
}

function createVServer() {
VSERVER_NAME=${ASSET_DETAILS%%|*}
ASSET_DETAILS=${ASSET_DETAILS#*|}
VSTYPE_NAME=${ASSET_DETAILS%%|*}
ASSET_DETAILS=${ASSET_DETAILS#*|}
TEMPLATE_NAME=${ASSET_DETAILS%%|*}
ASSET_DETAILS=${ASSET_DETAILS#*|}
NETWORK_NAMES=${ASSET_DETAILS%%|*}
ASSET_DETAILS=${ASSET_DETAILS#*|}
IP_ADDRESSES=${ASSET_DETAILS%%|*}
# Get Ids associated with names
getVSTypeId
getTemplateId
# Convert Network Names to Ids
NETWORK_IDS=""
while true
do
NETWORK_NAME=${NETWORK_NAMES%%,*}
NETWORK_NAMES=${NETWORK_NAMES#*,}
getNetworkId
if [[ "$NETWORK_IDS" != "" ]]
then
NETWORK_IDS="$NETWORK_IDS,$NETWORK_ID"
else
NETWORK_IDS=$NETWORK_ID
fi
if [[ "$NETWORK_NAME" == "$NETWORK_NAMES" ]]
then
break
fi
done
# Create vServer
echo "About to execute : $IAAS_HOME/bin/iaas-run-vserver --name $VSERVER_NAME --key-name $KEY_NAME --vserver-type $VSTYPE_ID --server-template-id $TEMPLATE_ID --vnets $NETWORK_IDS --ip-addresses $IP_ADDRESSES"
$IAAS_HOME/bin/iaas-run-vserver --name $VSERVER_NAME --key-name $KEY_NAME --vserver-type $VSTYPE_ID --server-template-id $TEMPLATE_ID --vnets $NETWORK_IDS --ip-addresses $IP_ADDRESSES
pauseUntilVServerRunning
}

function createVolume() {
VOLUME_NAME=${ASSET_DETAILS%%|*}
ASSET_DETAILS=${ASSET_DETAILS#*|}
VOLUME_SIZE=${ASSET_DETAILS%%|*}
# Create Volume
echo "About to execute : $IAAS_HOME/bin/iaas-create-volume --name $VOLUME_NAME --size $VOLUME_SIZE"
$IAAS_HOME/bin/iaas-create-volume --name $VOLUME_NAME --size $VOLUME_SIZE
# Lets pause
echo "Just Waiting 30 Seconds......"
sleep 30
}

function attachVolume() {
VSERVER_NAME=${ASSET_DETAILS%%|*}
ASSET_DETAILS=${ASSET_DETAILS#*|}
VOLUME_NAMES=${ASSET_DETAILS%%|*}
# Get vServer Id
getVServerId
# Convert Volume Names to Ids
VOLUME_IDS=""
while true
do
VOLUME_NAME=${VOLUME_NAMES%%,*}
VOLUME_NAMES=${VOLUME_NAMES#*,}
getVolumeId
if [[ "$VOLUME_IDS" != "" ]]
then
VOLUME_IDS="$VOLUME_IDS,$VOLUME_ID"
else
VOLUME_IDS=$VOLUME_ID
fi
if [[ "$VOLUME_NAME" == "$VOLUME_NAMES" ]]
then
break
fi
done
# Attach Volumes
echo "About to execute : $IAAS_HOME/bin/iaas-attach-volumes-to-vserver --vserver-id $VSERVER_ID --volume-ids $VOLUME_IDS"
$IAAS_HOME/bin/iaas-attach-volumes-to-vserver --vserver-id $VSERVER_ID --volume-ids $VOLUME_IDS
# Lets pause
echo "Just Waiting 30 Seconds......"
sleep 30
}

function processAssets() {
while read line
do
ACCOUNT=${line%%:*}
line=${line#*:}
ACTION=${line%%|*}
line=${line#*|}
if [[ "$ACTION" == "Connect" ]]
then
ACCOUNT_USER=${line%%|*}
line=${line#*|}
ACCOUNT_PASSWORD=${line%%|*}
connectToAccount

## Account Info
getNetworks
getVSTypes
getTemplates

continue
fi
if [[ "$ACTION" == "Create" ]]
then
ASSET=${line%%|*}
line=${line#*|}
ASSET_DETAILS=$line
if [[ "$ASSET" == "vServer" ]]
then
createVServer

continue
fi
if [[ "$ASSET" == "Volume" ]]
then
createVolume

continue
fi
fi
if [[ "$ACTION" == "Attach" ]]
then
ASSET=${line%%|*}
line=${line#*|}
ASSET_DETAILS=$line
if [[ "$ASSET" == "Volume" ]]
then
getVolumes
getVServers
attachVolume

continue
fi
fi
if [[ "$ACTION" == "Connect" ]]
then
disconnectFromAccount

continue
fi
done < $INPUT_FILE
}

# Should Parameterise this

while [ $# -gt 0 ]
do
case "$1" in
-a) INPUT_FILE="$2"; shift;;
*) echo ""; echo >&2 \
"usage: $0 [-a <asset definition="definition" file="file">] (Default is CreateAssets.in)"
echo""; exit 1;;
*) break;;
esac
shift
done

processAssets

echo "**************************************"
echo "*****  Finished Creating Assets  *****"
echo "**************************************"

CreateAssetsProd.in

Production:Connect|exaprod|welcome1

Production:Create|vServer|VS006|VSTProduction|BaseOEL56ServerTemplate|EoIB-otd-prod,vn-prod-web,IPoIB-default,IPoIB-vserver-shared-storage|10.51.223.13,192.168.0.13,10.117.81.67,172.17.0.14
Production:Create|vServer|VS007|VSTProduction|BaseOEL56ServerTemplate|EoIB-otd-prod,vn-prod-web,IPoIB-default,IPoIB-vserver-shared-storage|10.51.223.14,192.168.0.14,10.117.81.68,172.17.0.15
Production:Create|vServer|VS008|VSTProduction|BaseOEL56ServerTemplate|EoIB-wls-prod,vn-prod-web,IPoIB-default,IPoIB-vserver-shared-storage|10.51.225.61,192.168.0.61,10.117.81.61,172.17.0.16
Production:Create|vServer|VS009|VSTProduction|BaseOEL56ServerTemplate|EoIB-wls-prod,vn-prod-web,IPoIB-default,IPoIB-vserver-shared-storage|10.51.225.62,192.168.0.62,10.117.81.62,172.17.0.17
Production:Create|vServer|VS000|VSTProduction|BaseOEL56ServerTemplate|EoIB-wls-prod,vn-prod-web,IPoIB-default,IPoIB-vserver-shared-storage|10.51.225.63,192.168.0.63,10.117.81.63,172.17.0.18
Production:Create|vServer|VS001|VSTProduction|BaseOEL56ServerTemplate|EoIB-wls-prod,vn-prod-web,IPoIB-default,IPoIB-vserver-shared-storage|10.51.225.64,192.168.0.64,10.117.81.64,172.17.0.19
Production:Create|vServer|VS002|VSTProduction|BaseOEL56ServerTemplate|EoIB-wls-prod,vn-prod-web,IPoIB-default,IPoIB-vserver-shared-storage|10.51.225.65,192.168.0.65,10.117.81.65,172.17.0.20
Production:Create|vServer|VS003|VSTProduction|BaseOEL56ServerTemplate|EoIB-wls-prod,vn-prod-web,IPoIB-default,IPoIB-vserver-shared-storage|10.51.225.66,192.168.0.66,10.117.81.66,172.17.0.21

Production:Create|Volume|VS006|50
Production:Create|Volume|VS007|50
Production:Create|Volume|VS008|50
Production:Create|Volume|VS009|50
Production:Create|Volume|VS000|50
Production:Create|Volume|VS001|50
Production:Create|Volume|VS002|50
Production:Create|Volume|VS003|50

Production:Attach|Volume|VS006|VS006
Production:Attach|Volume|VS007|VS007
Production:Attach|Volume|VS008|VS008
Production:Attach|Volume|VS009|VS009
Production:Attach|Volume|VS000|VS000
Production:Attach|Volume|VS001|VS001
Production:Attach|Volume|VS002|VS002
Production:Attach|Volume|VS003|VS003

Production:Disconnect

Development:Connect|exadev|welcome1

Development:Create|vServer|VS014|VSTDevelopment|BaseOEL56ServerTemplate|EoIB-development,IPoIB-default,IPoIB-vserver-shared-storage|10.51.224.24,10.117.81.71,172.17.0.24
Development:Create|vServer|VS015|VSTDevelopment|BaseOEL56ServerTemplate|EoIB-development,IPoIB-default,IPoIB-vserver-shared-storage|10.51.224.25,10.117.81.72,172.17.0.25
Development:Create|vServer|VS016|VSTDevelopment|BaseOEL56ServerTemplate|EoIB-development,IPoIB-default,IPoIB-vserver-shared-storage|10.51.224.26,10.117.81.73,172.17.0.26
Development:Create|vServer|VS017|VSTDevelopment|BaseOEL56ServerTemplate|EoIB-development,IPoIB-default,IPoIB-vserver-shared-storage|10.51.224.27,10.117.81.74,172.17.0.27
Development:Create|vServer|VS018|VSTDevelopment|BaseOEL56ServerTemplate|EoIB-development,IPoIB-default,IPoIB-vserver-shared-storage|10.51.224.28,10.117.81.75,172.17.0.28
Development:Create|vServer|VS019|VSTDevelopment|BaseOEL56ServerTemplate|EoIB-development,IPoIB-default,IPoIB-vserver-shared-storage|10.51.224.29,10.117.81.76,172.17.0.29
Development:Create|vServer|VS020|VSTDevelopment|BaseOEL56ServerTemplate|EoIB-development,IPoIB-default,IPoIB-vserver-shared-storage|10.51.224.30,10.117.81.77,172.17.0.30
Development:Create|vServer|VS021|VSTDevelopment|BaseOEL56ServerTemplate|EoIB-development,IPoIB-default,IPoIB-vserver-shared-storage|10.51.224.31,10.117.81.78,172.17.0.31
Development:Create|vServer|VS022|VSTDevelopment|BaseOEL56ServerTemplate|EoIB-development,IPoIB-default,IPoIB-vserver-shared-storage|10.51.224.32,10.117.81.79,172.17.0.32
Development:Create|vServer|VS023|VSTDevelopment|BaseOEL56ServerTemplate|EoIB-development,IPoIB-default,IPoIB-vserver-shared-storage|10.51.224.33,10.117.81.80,172.17.0.33
Development:Create|vServer|VS024|VSTDevelopment|BaseOEL56ServerTemplate|EoIB-development,IPoIB-default,IPoIB-vserver-shared-storage|10.51.224.34,10.117.81.81,172.17.0.34
Development:Create|vServer|VS025|VSTDevelopment|BaseOEL56ServerTemplate|EoIB-development,IPoIB-default,IPoIB-vserver-shared-storage|10.51.224.35,10.117.81.82,172.17.0.35
Development:Create|vServer|VS026|VSTDevelopment|BaseOEL56ServerTemplate|EoIB-development,IPoIB-default,IPoIB-vserver-shared-storage|10.51.224.36,10.117.81.83,172.17.0.36
Development:Create|vServer|VS027|VSTDevelopment|BaseOEL56ServerTemplate|EoIB-development,IPoIB-default,IPoIB-vserver-shared-storage|10.51.224.37,10.117.81.84,172.17.0.37


Development:Create|Volume|VS014|50
Development:Create|Volume|VS015|50
Development:Create|Volume|VS016|50
Development:Create|Volume|VS017|50
Development:Create|Volume|VS018|50
Development:Create|Volume|VS019|50
Development:Create|Volume|VS020|50
Development:Create|Volume|VS021|50
Development:Create|Volume|VS022|50
Development:Create|Volume|VS023|50
Development:Create|Volume|VS024|50
Development:Create|Volume|VS025|50
Development:Create|Volume|VS026|50
Development:Create|Volume|VS027|50

Development:Attach|Volume|VS014|VS014
Development:Attach|Volume|VS015|VS015
Development:Attach|Volume|VS016|VS016
Development:Attach|Volume|VS017|VS017
Development:Attach|Volume|VS018|VS018
Development:Attach|Volume|VS019|VS019
Development:Attach|Volume|VS020|VS020
Development:Attach|Volume|VS021|VS021
Development:Attach|Volume|VS022|VS022
Development:Attach|Volume|VS023|VS023
Development:Attach|Volume|VS024|VS024
Development:Attach|Volume|VS025|VS025
Development:Attach|Volume|VS026|VS026
Development:Attach|Volume|VS027|VS027

Development:Disconnect

このエントリの原文は以下のリンクに掲載されていたものです。
Exalogic 2.0.1 Tea Break Snippets - Scripting Asset Creation (The Old Toxophilist)
http://theoldtoxophilist.blogspot.co.uk/2012/09/exalogic-201-tea-break-snippets.html

0 件のコメント:

コメントを投稿