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 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:
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:
Hostnamen der Steuerung festlegen, an die nachfolgende Befehle geleitet werden. Dies muss erfolgen, bevor weitere Befehle verwendet werden.
Von der Steuerung trennen. Dies schließt die ssh-Mastersitzung mit der Steuerung.
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").
Funktioniert wie '3t <beliebiger 3tshell-Befehl>', ermöglicht aber den Dialogbetrieb, da die CA AppLogic®-Shell mit aktiviertem ssh-Pseudoterminal ausgeführt wird.
Die interaktive CA AppLogic®-Shell aufrufen.
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.
Den Namen der aktuellen Anwendung (wie durch ca festgelegt) drucken
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
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.
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.
Verknüpfung. wie "3t app list".
Verknüpfung. wie "3t app start `pwa`".
Verknüpfung. wie "3t app stop `pwa`".
Wird in CA AppLogic® 2.3 und höher nicht unterstützt. Verwenden Sie stattdessen die die neue Operation "vol manage".
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:
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
Copyright © 2013 CA.
Alle Rechte vorbehalten.
|
|