前のトピック: グローバル ユーザおよびグループ

次のトピック: アプリケーションとアプライアンスのロック


高度な使用方法

GNU bash を使用する場合、クライアント側マクロを使用して、グリッド上で実行している Linux マシンまたは VDS タイプの Linux サーバの CLI コマンドからCA AppLogic シェル コマンドに直接アクセスすることもできます。

クライアント側マクロ

GNU bash および OpenSSH クライアントのクライアント側マクロ。ローカルのシェル プロンプトから直接 3tshell (CA AppLogic コマンド ライン インターフェース)のすべての機能に簡単にアクセスできます。

機能

このファイルをシステム上で使用する方法

  1. GNU Bash 2.0 以降および OpenSSH クライアント プログラム(SSH)バージョン 3.9 以降があることを確認します。
  2. rmacros.sh トピックの内容をコピーし、ユーザの .sh ファイルに貼り付けます。
  3. このファイルのファイル名を rmacros.sh と指定します。
  4. ディスクに保存します。
  5. source コマンドを使用して、シェルに含めます。

.bashrc ファイルでこの手順を実行すると、開始するすべてのインタラクティブ シェル インスタンスでこれを利用できます。

rmacros.sh ファイルがロードされると、以下のコマンドをシェル プロンプトから使用できるようになります。 これらのコマンドは、スクリプトから「source」コマンドを実行して rmacros.sh ファイルを含めることで、自作の非インタラクティブ スクリプト内でも使用できます。

controller hostname-or-ip

後続コマンドの実行対象となるコントローラのホスト名を設定します。 これは、ほかのコマンドを使用する前に実行される必要があります。

controller

コントローラから切断します。 これにより、コントローラのマスタ ssh セッションが閉じられます。

3t <任意の 3tshell コマンド>

これは、CA AppLogic シェル プロンプトでコマンドを入力するのと同じことです。 この形式は、シンプルなコマンドや無人バッチ処理を実行する場合に便利です。 ユーザによる操作(ボリューム管理など)を必要とするコマンドには、3t -t を使用します。

3t -t <任意の 3tshell コマンド>

「3t 任意の 3tshell コマンド」と同じですが、ssh 擬似端子を有効にして CA AppLogic シェルを実行することによって、インタラクティブ モードを有効にします。

3t

インタラクティブ CA AppLogic シェルを呼び出します。

ca appname

現在のアプリケーションを設定します。 これは、インタラクティブ シェルの「ca」コマンドと同じ方法で機能します。 「3t」コマンドの呼び出しごとに CA AppLogic シェルの新規インスタンスが開始されるため、3t ca myapp の実行は機能しません。

pwa

現在のアプリケーションの名前を出力します(ca で設定されたとおりに)。

assh [appname:]component

現在のアプリケーションまたは指定されたアプリケーションの実行中アプライアンス インスタンスにインタラクティブ シェルを開きます。 component はアプリケーション階層内のインスタンスのフル ネームです。 最上位レベルのアセンブリ(main.)の名前は省略できます。たとえば、以下のように表記できます。

assh the-app:main.web.srv1 
ca the-app ; assh web.srv1 
assh [app:]component cmd [args]

アプライアンス インスタンス上で非インタラクティブ コマンドを実行します。 注: CA AppLogic の古いバージョン(1.x)では、コマンド名と引数にスペースを含めることはできません。次のような場合、期待どおりには機能しません。

assh web.srv1 cat "the file with spaces in its name". 

古いグリッド上でこれを実行する必要がある場合は、短いスクリプトを作成し、下記の ascp コマンドを使用して、実行中アプライアンスにコピーしてから、スクリプトを開始します。

ascp src dest

実行中アプライアンスから、または実行中アプライアンスへファイルをコピーします。 src と dest パラメータのいずれかは、ローカルのファイルまたはディレクトリの名前である必要があります。 もう一方は、「scp」コマンドと同様の形式でリモートのアプライアンスおよびファイル名を指定します。

comp.name:filename 

コンポーネント名は、アプリケーション アセンブリ内のコンポーネントのフル パスです(assh の場合と同様、main. プレフィックスは省略できます)。 このコマンドを実行するには、現在のアプリケーションが ca コマンドで設定されている必要があります。

als

ショートカット 3t app list と同じ。

astart

ショートカット 3t app start `pwa` と同じ。

astop

ショートカット 3t app stop `pwa` と同じ。

vmnt

CA AppLogic 2.3 以降ではサポートされていません。 代わりに、新しいボリューム管理操作を使用します。

vumnt

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 

このセクションには、以下のトピックが含まれています。

rmacros.sh の例

rmacros.sh の例

注: ここに記載されているコードはサンプルであり、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