Vorheriges Thema: Globale Benutzer und GruppenNächstes Thema: Sperren von Anwendungen und Appliances


Erweiterte Verwendung

Wenn Sie GNU Bash verwenden, können Sie auch clientseitige Makros verwenden, um direkt über CLI-Befehle auf Ihrem eigenen Linux-Rechner oder einem im Grid ausgeführten VDS-Linux-Server auf die Befehle der CA AppLogic®-Shell zuzugreifen.

Clientseitige Makros

Clientseitige Makros für den GNU Bash- und OpenSSH-Client vereinfachen den Zugriff auf alle Funktionen von 3tshell – die CA AppLogic®-Befehlszeilenschnittstelle, direkt von Ihrer lokalen Eingabeaufforderung aus.

Funktionen:

So verwenden Sie diese Datei auf Ihrem System:

  1. Stellen Sie sicher, dass Sie über GNU Bash 2.0 oder höher und das OpenSSH-Client-Programm (ssh), Version 3.9 oder höher, verfügen.
  2. Kopieren Sie den Inhalt des rmacros.sh-Themas, und fügen Sie ihn in eine eigene .sh-Datei ein.
  3. Nennen Sie diese Datei "rmacros.sh".
  4. Speichern Sie sie auf Ihrer Festplatte.
  5. Beziehen Sie sie mit dem source-Befehl in Ihre Shell ein.

Sie können diese Schritte auch in der .bashrc-Datei durchführen, damit sie für jede interaktive Shell-Instanz verfügbar ist, die Sie starten.

Sobald die rmacros.sh-Datei geladen ist, sind die folgenden Befehle in der Shell-Eingabeaufforderung verfügbar. Die gleichen Befehle können auch in einem nicht-interaktiven Skript verwendet werden, indem einfach die Datei "rmacros.sh" in Ihrem Skript mit dem source-Befehl eingebunden wird:

controller hostname-oder-ip

Hostnamen der Steuerung festlegen, an die nachfolgende Befehle geleitet werden. Dies muss erfolgen, bevor weitere Befehle verwendet werden.

controller

Von der Steuerung trennen. Dies schließt die ssh-Mastersitzung mit der Steuerung.

3t <beliebiger 3tshell-Befehl>

Dies ist äquivalent zur Eingabe des Befehls in der Shell-Eingabeaufforderung in CA AppLogic®. Diese Form ist nützlich für einfache Befehle sowie für Batchoperationen ohne Benutzereingriff. Verwenden Sie "3t -t" für Befehle, die einen Benutzereingriff benötigen (zum Beispiel "vol manage").

3t -t <beliebiger 3tshell-Befehl>

Funktioniert wie '3t <beliebiger 3tshell-Befehl>', ermöglicht aber den Dialogbetrieb, da die CA AppLogic®-Shell mit aktiviertem ssh-Pseudoterminal ausgeführt wird.

3t

Die interaktive CA AppLogic®-Shell aufrufen.

ca appname

Die aktuelle Anwendung festlegen. Dies funktioniert auf die gleiche Weise wie der Befehl "ca" in der interaktiven Shell. Die Ausführung von "3t ca myapp" funktioniert nicht, da bei jedem Aufruf des Befehls "3t" eine neue Instanz der CA AppLogic®-Shell gestartet wird.

pwa

Den Namen der aktuellen Anwendung (wie durch ca festgelegt) drucken

assh [appname:]component

Eine interaktive Shell für eine laufende Appliance-Instanz in der aktuellen Anwendung oder in der angegebenen Anwendung öffnen. 'component' ist der vollständige Name der Instanz in der Anwendungshierarchie. Der Name der Assembly auf der obersten Ebene (main.) kann ausgelassen werden; beispielsweise sind folgende Befehle äquivalent:

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

Einen nicht-interaktiven Befehl auf einer Appliance-Instanz ausführen. HINWEIS: auf älteren Versionen (1.x) von CA AppLogic® dürfen der Befehlsname und die Argumente keine Leerzeichen enthalten, das heißt, Folgendes wird nicht erwartungsgemäß funktionieren:

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

Wenn Sie einen solchen Befehl auf einem älteren Grid ausführen müssen, erstellen Sie ein kurzes Skript, kopieren Sie dieses mithilfe des weiter unten dargestellten Befehls "ascp" auf die laufende Appliance, und starten Sie dann dieses Skript.

ascp src dest

Eine Datei auf eine/von einer laufenden Appliance kopieren. Der Parameter 'src' oder der Parameter 'dest' muss der Name einer lokalen Datei oder eines lokalen Verzeichnisses sein. Der andere Parameter gibt die entfernte Appliance und den Dateinamen in einer dem Befehl "scp" ähnlichen Form an:

comp.name:filename 

Der Komponentenname (comp.name) ist der vollständige Pfad der Komponente in der Anwendungs-Assembly (wie bei assh kann das Präfix main. ausgelassen werden). Für diesen Befehl muss die aktuelle Anwendung mit dem ca-Befehl festgelegt werden.

als

Verknüpfung. wie "3t app list".

astart

Verknüpfung. wie "3t app start `pwa`".

astop

Verknüpfung. wie "3t app stop `pwa`".

vmnt

Wird in CA AppLogic® 2.3 und höher nicht unterstützt. Verwenden Sie stattdessen die die neue Operation "vol manage".

vumnt

Wird in CA AppLogic® 2.3 und höher nicht unterstützt.

Konfigurieren benutzerspezifischer SSH-Optionen

Anders als bei der normalen Art und Weise der Festlegung von SSH-Optionen (bei der diese in Ihrer Datei "~/.ssh/config" abgelegt werden), akzeptieren die von rmacros.sh bereitgestellten Befehle eine Umgebungsvariableneinstellung mit Optionen, die sich nur auf die von den Makros generierten ssh-Ausführungen auswirken, nicht aber auf andere ssh-Befehle. Dies ist nützlich, wenn Sie ein anderes Setup für die Arbeit mit CA AppLogic®-Grid(s) und für andere ssh-Sitzungen benötigen und die von der Datei ".ssh/config" unterstützte hostbasierte Methode nicht geeignet ist, um die unterschiedlichen Optionen zu trennen. Dies schließt den Fall ein, wenn Sie auch "Verwalter"-Zugriff auf das CA AppLogic®-Grid haben (wenn Sie z. B. dieses Grid installiert haben) - in solch einem Fall haben Sie einen SSH-Schlüssel, der einen Root-Zugriff auf die Steuerung ermöglicht - nicht das, was Sie für einen "normalen" Client-Zugriff benötigen.

Um zusätzliche Optionen für die Remote-Zugriffs-Makros in rmacros.sh anzugeben, legen Sie die Variable AL_SSH_OPT fest. Sie sollte Optionen in der von ssh und all seinen Begleitprogrammen (scp, sftp usw.) akzeptierten Form enthalten: -o OptionName=option-value. Benutzen Sie keine Kurzoptionen wie -i, -t usw. - diese funktionieren bei ssh, aber nicht bei scp.

Beispiel:
export AL_SSH_OPT='-o IdentityFile=/home/lk/t-key -o IdentitiesOnly=yes -o StrictHostKeyChecking=no' 

Dies teilt SSH mit: Verwende den Schlüssel "/home/lk/t-key" für die Authentifizierung mit öffentlichem Schlüssel; verwende keinen der von ssh-agent bereitgestellten Schlüssel; deaktiviere strikte Hostidentitäts-Überprüfung (verwenden Sie die letzte Option nur, wenn Sie häufig Grids völlig neu installieren, was dazu führt, dass sich die SSH ID der Steuerung jedes Mal ändert).

Schneller und einfacher Zugriff mit SSH-Mastersitzung

Die in rmacros.sh definierten Funktionen verwenden die Mastersitzungs-Funktion des OpenSSH-Clients. Der erste Befehl, der ausgeführt wird, startet im Hintergrund den ssh-Client im 'Master'-Modus, und alle nachfolgenden Befehle verwenden die von 'master' verwaltete Sitzung, um weitere ssh-Sitzungen über den gleichen sicheren Kanal auszuführen.

Dies bietet zwei Vorteile: zum Ersten muss die Passphrase für den Zugriff auf den privaten SSH-Schlüssel nur einmal eingegeben werden - danach wird die Sitzung offen gehalten, und es werden keine weiteren Anmeldungen durchgeführt.

Zum Zweiten sind dadurch neue ssh-Ausführungen so schnell wie die Eingabe von Befehlen in eine bereits geöffnete SSH-Sitzung – tatsächlich sogar schneller – weil der Befehl einmal gesendet wird, wenn Sie die Eingabetaste drücken, während eine interaktive Sitzung zeichenweise Echos während der Eingabe des Befehls verwendet.

Wenn Sie außerdem Befehle lokal von Ihrer Shell aus und nicht von der 3tshell-Konsole ausführen, ist es möglich, die volle Leistung der Shell auszunutzen und Befehle zu erfinden, die mit einer interaktiven 3tshell-Sitzung nicht möglich sind. z. B.:

Abrufen einer Liste von laufenden Anwendungen:
3t app list | grep running

Speichern einer Volume-Liste in einer Datei:
3t vol list --all >file

Übertragen einer Konfiguration von einer Anwendung auf eine andere:

3t app config app1 --batch | 3t app config app2 --stdin 

Dieses Kapitel enthält folgende Themen:

Beispiel für APP--rmacros.sh

Beispiel für APP--rmacros.sh

Hinweis: Der hier angegebene Code ist ein Beispiel, das eine mögliche Methode für die Erweiterung und Vereinfachung des Zugriffs auf die AppLogic-CLI über SSH veranschaulicht. Er wird wie besehen zur Verfügung gestellt und ist nicht Bestandteil des von AppLogic unterstützten Codes. Der CA-Support stellt keine Hilfe, Aktualisierungen oder Hotfixes dafür zur Verfügung. In diesem Beispiel gefundene Fehler und Auslassungen können CA gemeldet werden, und diese Datei wird bei Bedarf im Rahmen des normalen Aktualisierungszyklus für die Onlinedokumentation korrigiert.

#!/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