GNU bash を使用する場合、クライアント側マクロを使用して、グリッド上で実行している Linux マシンまたは VDS タイプの Linux サーバの CLI コマンドからCA AppLogic シェル コマンドに直接アクセスすることもできます。
GNU bash および OpenSSH クライアントのクライアント側マクロ。ローカルのシェル プロンプトから直接 3tshell (CA AppLogic コマンド ライン インターフェース)のすべての機能に簡単にアクセスできます。
機能
このファイルをシステム上で使用する方法
.bashrc ファイルでこの手順を実行すると、開始するすべてのインタラクティブ シェル インスタンスでこれを利用できます。
rmacros.sh ファイルがロードされると、以下のコマンドをシェル プロンプトから使用できるようになります。 これらのコマンドは、スクリプトから「source」コマンドを実行して rmacros.sh ファイルを含めることで、自作の非インタラクティブ スクリプト内でも使用できます。
後続コマンドの実行対象となるコントローラのホスト名を設定します。 これは、ほかのコマンドを使用する前に実行される必要があります。
コントローラから切断します。 これにより、コントローラのマスタ ssh セッションが閉じられます。
これは、CA AppLogic シェル プロンプトでコマンドを入力するのと同じことです。 この形式は、シンプルなコマンドや無人バッチ処理を実行する場合に便利です。 ユーザによる操作(ボリューム管理など)を必要とするコマンドには、3t -t を使用します。
「3t 任意の 3tshell コマンド」と同じですが、ssh 擬似端子を有効にして CA AppLogic シェルを実行することによって、インタラクティブ モードを有効にします。
インタラクティブ CA AppLogic シェルを呼び出します。
現在のアプリケーションを設定します。 これは、インタラクティブ シェルの「ca」コマンドと同じ方法で機能します。 「3t」コマンドの呼び出しごとに CA AppLogic シェルの新規インスタンスが開始されるため、3t ca myapp の実行は機能しません。
現在のアプリケーションの名前を出力します(ca で設定されたとおりに)。
現在のアプリケーションまたは指定されたアプリケーションの実行中アプライアンス インスタンスにインタラクティブ シェルを開きます。 component はアプリケーション階層内のインスタンスのフル ネームです。 最上位レベルのアセンブリ(main.)の名前は省略できます。たとえば、以下のように表記できます。
assh the-app:main.web.srv1 ca the-app ; assh web.srv1
アプライアンス インスタンス上で非インタラクティブ コマンドを実行します。 注: CA AppLogic の古いバージョン(1.x)では、コマンド名と引数にスペースを含めることはできません。次のような場合、期待どおりには機能しません。
assh web.srv1 cat "the file with spaces in its name".
古いグリッド上でこれを実行する必要がある場合は、短いスクリプトを作成し、下記の ascp コマンドを使用して、実行中アプライアンスにコピーしてから、スクリプトを開始します。
実行中アプライアンスから、または実行中アプライアンスへファイルをコピーします。 src と dest パラメータのいずれかは、ローカルのファイルまたはディレクトリの名前である必要があります。 もう一方は、「scp」コマンドと同様の形式でリモートのアプライアンスおよびファイル名を指定します。
comp.name:filename
コンポーネント名は、アプリケーション アセンブリ内のコンポーネントのフル パスです(assh の場合と同様、main. プレフィックスは省略できます)。 このコマンドを実行するには、現在のアプリケーションが ca コマンドで設定されている必要があります。
ショートカット 3t app list と同じ。
ショートカット 3t app start `pwa` と同じ。
ショートカット 3t app stop `pwa` と同じ。
CA AppLogic 2.3 以降ではサポートされていません。 代わりに、新しいボリューム管理操作を使用します。
CA AppLogic 2.3 以降ではサポートされていません。
カスタム SSH オプションの設定
SSH オプションを設定する通常の方法(~/.ssh/config ファイル内で設定する)以外に、rmacros.sh で提供されるコマンドも、オプションが指定された環境変数設定を受け入れます。このオプションは、マクロで生成される ssh 呼び出しのみに影響し、ほかの ssh コマンドには影響を与えません。 これは、CA AppLogic グリッドの操作や別の ssh セッション用に異なる設定が必要な場合に便利です。.ssh/config ファイルでサポートされるホストごとのメソッドは、異なるオプションを分離するのに適していないためです。 このことは、CA AppLogic グリッドへの「管理者」アクセス権がある場合(そのグリッドを自分がインストールした場合)にも当てはまります。そのような場合、コントローラへの root アクセス権を提供する SSH キーが付与されますが、これは通常の「クライアント」として機能する際には必要のないものです。
rmacros.sh でリモート アクセス マクロにオプションを追加するには、AL_SSH_OPT 変数を設定します。 変数には、ssh およびすべての同系プログラム(scp、sftp など)で受け入れられる形式(-o OptionName=option-value)でオプションを含める必要があります。 -i や -t などの省略オプションは使用しないでください。それらは ssh では機能しますが、scp では機能しません。
例: export AL_SSH_OPT='-o IdentityFile=/home/lk/t-key -o IdentitiesOnly=yes -o StrictHostKeyChecking=no'
これは SSH に次の内容を伝えます。公開キー認証に対してキー /home/lk/t-key を使用する。ssh エージェントから付与されたキーは使用しない。厳密なホスト ID チェックを無効にする(これは、グリッドをゼロから頻繁に再インストールする場合のみ適用し、コントローラの SSH ID が毎回変更されるようにします)。
マスタ SSH セッションの迅速かつ簡単なアクセス
rmacros.sh で定義される機能では、OpenSSH クライアントのマスタ セッション機能を使用します。 最初に実行されるコマンドによって、バックグラウンド ssh クライアントが「マスタ」モードで開始されます。後続のすべてのコマンドでは、「マスタ」によって管理されるセッションを使用して、同じ安全なチャネル上で追加の ssh セッションが実行されます。
これには 2 つの利点があります。1 つは、SSH 秘密キーにアクセスするためのパスフレーズの入力が 1 回で済む点です。その後、セッションは開いたままに維持され、追加のログインは行われません。
もう 1 つは、これによって、「ssh」の新規呼び出しが、すでに開いている SSH セッションへのコマンドを入力するのと同じくらい速く、実際にはさらに速くなる点です。前者では Enter キーを押したときにコマンドが 1 回送信されるのに対して、インタラクティブ セッションではコマンドが入力されるたびに 1 字単位の echo が使用されるためです。
また、3tshell コンソールからではなく、シェルからローカルでコマンドを実行すると、シェルの全機能を使用でき、インタラクティブ 3tshell セッションでは構成できないコマンドを構成できます。以下はその例です。
実行中のアプリケーションのリストを取得する。
3t app list | grep running
ボリューム リストをファイルに保存する。
3t vol list --all >file
アプリケーションから別のアプリケーションに設定を転送する。
3t app config app1 --batch | 3t app config app2 --stdin
このセクションには、以下のトピックが含まれています。
注: ここに記載されているコードはサンプルであり、SSH を介して AppLogic CLI に簡単にアクセスするための方法を示すために現状有姿で提供されるもので、AppLogic のサポート対象のコードではありません。このコードについて、CA サポートはサポート、更新、ホットフィックスを提供しません。 発見されたエラーや漏れを CA に報告していただいた場合、CA はオンライン マニュアルの通常のアップデート サイクルの一環として、必要に応じてファイルを修正する場合があります。
#!/bin/bash # Client-side macros for access to AppLogic grid controller # (C) L.Kalev 2006 (lion//3tera.com) # temp dir for master-session sockets export CSPATH=/tmp/apl_lnkroot # controller name export AL_CTL export AL_CTLSOCKOPT export PWA ssh_cmd="ssh -l root $AL_SSH_OPT" # !! _FS must match the value set in '3trsh' for this to work! _FS='`' function pack() { local i="$IFS" IFS="$_FS" ARGS="$*$_FS" IFS="$i" return 0 } ## unpack #OLD_IFS="$IFS" #if [[ "$T" = *$_FS* ]] ; then IFS="$_FS" ; fi #set $T #IFS="$OLD_IFS" function controller () { [[ -z "$1" ]] && { echo $AL_CTL ; return 0 ; } local OPT_FC= if [ "$1" = '-f' ] ; then OPT_FC=1 ; shift ; fi [[ "$1" != "$AL_CTL" ]] && PWA= # close old connection, if needed if [[ -n "$AL_CTL" ]] && [[ -S $CSPATH/$AL_CTL ]] ; then if [[ -z "$OPT_FC" ]] && [[ "$1" != "-" ]] ; then AL_CTL=$1 AL_CTLSOCKOPT="-o ControlPath=$CSPATH/$AL_CTL" return 0 # don't re-connect if connection is open fi echo "Closing old connection to $AL_CTL" >&2 kill $(<$CSPATH/$AL_CTL.pid) fi AL_CTL=$1 if [ "$AL_CTL" = '-' ] ; then AL_CTL= ; return 0 ; fi # disconnect only # make sure it has no spaces or other junk set -- $AL_CTL [[ "$1" != "$AL_CTL" ]] && { echo "invalid hostname" >&2 ; return 1 ; } ping -c 1 -n -q "$AL_CTL" >/dev/null || echo "warning: ping $AL_CTL failed" AL_CTLSOCKOPT="-o ControlPath=$CSPATH/$AL_CTL" } function sock-chk () { [[ -z "$AL_CTL" ]] && { echo "controller name not set, use the 'controller' command to set it" >&2 ; return 1 ; } if [[ -S $CSPATH/$AL_CTL ]] ; then return 0 ; fi mkdir -p $CSPATH # redirect all handles of the background ssh process, in case our # parent waits for eof on a std handle (it won't get it, if the handle # gets dup()ed into the forked ssh) $ssh_cmd -M -N -f $AL_CTLSOCKOPT $AL_CTL >/dev/null </dev/null 2>$CSPATH/$AL_CTL.2 local R=$? if [[ $R != 0 ]] ; then cat $CSPATH/$AL_CTL.2 >&2 return $R fi T=`ps -C ssh -o pid,args | grep -e "-M -N -f $AL_CTLSOCKOPT"` set -- $T echo $1 >$CSPATH/$AL_CTL.pid return 0 } function 3t () { sock-chk || return 1 local T= local A= [[ $# == 0 ]] && T=-t if [[ "$1" = '-t' ]] ; then T=-t ; shift ; fi [[ -n "$PWA" ]] && A="=$PWA" local TC1 TC2 TC1=`stat --format '%Y' $CSPATH/$AL_CTL.2` ARGS="$A" if [ $# != 0 ] ; then pack $A "$@" ; fi $ssh_cmd $T -o LogLevel=ERROR $AL_CTLSOCKOPT $AL_CTL "$ARGS" A=$? TC2=`stat --format '%Y' $CSPATH/$AL_CTL.2` if [[ "$TC1" != "$TC2" ]] && ! [[ -S $CSPATH/$AL_CTL ]] ; then echo "Connection to controller lost, re-run the command to reconnect" return 1 fi return $A } function ca () { [[ -n "$1" ]] || { PWA= ; return 0 ; } # [[ -n "$1" ]] || { echo "use: ca app-name" >&2; return 1; } 3t app info "$1" >/dev/null || return $? export PWA=$1 return 0 } function pwa () { echo $PWA } function assh () { [[ -z "$1" ]] && { echo "use: assh [app:]comp" >&2 ; return 1 ; } local APP # this can be removed when we fix the curr. app support in 3trsh if [[ $1 == *:* ]] ; then APP=$1 else [[ -z "$PWA" ]] && { echo "current app not set, use full name" >&2; return 1; } APP=$PWA:$1 fi sock-chk || return 1; shift local T= if [[ -z "$@" && -t 0 && -t 1 ]] ; then # echo "using tty" T=-t fi local TC1 TC2 TC1=`stat --format '%Y' $CSPATH/$AL_CTL.2` ARGS="sh $APP" if [ $# != 0 ] ; then pack sh $APP "$@" ; fi $ssh_cmd $T $AL_CTLSOCKOPT $AL_CTL "$ARGS" TC2=`stat --format '%Y' $CSPATH/$AL_CTL.2` if [[ "$TC1" != "$TC2" ]] && ! [[ -S $CSPATH/$AL_CTL ]] ; then echo "Connection to controller lost, re-run the command to reconnect" return 1 fi } function ascp () { # temporary - operation w/o current app can wait [[ -n "$PWA" ]] || { echo "current app. not set" >&2; return 1; } sock-chk || return 1 # NB: 'local' and the {#} substr match are specific to 'bash', won't work on std bourne shell local A1=$1 local P1=${1%%:*} local P2= local S1= if [[ "$P1" != $1 ]] ; then # $1 is remote S1=${1#*:} [[ $S1 == /* ]] || S1=/root/$S1 [[ -n $P1 ]] || return 1; A1="root@$AL_CTL:/app/$PWA/$P1$S1" fi local A2=$2 P1=${2%%:*} if [[ "$P1" != $2 ]] ; then # $2 is remote S1=${2#*:} [[ $S1 == /* ]] || S1=/root/$S1 [[ -n $P1 ]] || return 1; A2="root@$AL_CTL:/app/$PWA/$P1$S1" fi # should have the same options as $ssh_cmd scp $AL_SSH_OPT $AL_CTLSOCKOPT "$A1" "$A2" } # ---------- various shortcuts function als () { 3t app list } function astop () { 3t app stop "$@" } function astart () { 3t app start "$@" } # not very useful for now (need to get it to mount on OUR system) function vmnt () { 3t vol mount "$@" } function vumnt () { 3t vol unmount "$@" } # ssh $T -S /tmp/opty3sk -i ~/t-key -o IdentitiesOnly=yes # master start # ssh -A -i ~/t-key -M -S /tmp/opty3sk -N -f -o IdentitiesOnly=yes $AL_CTL
Copyright © 2012 CA. All rights reserved. |
|