如果使用的是 GNU Bash,还可以使用客户端宏直接从您自己的 Linux 计算机或运行在网格上的 VDS 类型 Linux 服务器上访问 CA AppLogic® shell 命令。
使用适用于 GNU Bash 和 OpenSSH 客户端的客户端宏,可以轻松地直接从本地 shell 提示符访问 3tshell(CA AppLogic® 命令行界面)的所有功能。
功能:
要在您的系统上使用该文件,请执行以下操作:
也可以在 .bashrc 文件中执行此步骤,以使其可用于您启动的每个交互式 shell 实例。
一旦加载 rmacros.sh 文件,以下命令即变为可以从 shell 提示符中使用。 相同的命令也可以用在非交互式脚本中,为此,您只需通过“source”命令从脚本添加 rmacros.sh 文件:
设置后续命令将定向到的控制器的主机名。 此操作必须在使用任何其他命令前完成。
与控制器断开连接。 这样将关闭与控制器的主要 ssh 会话。
这相当于在 CA AppLogic® shell 提示符处键入命令。 这种形式对于简单命令以及无人干预的批量操作很有用。 需要用户干预的命令(例如:vol manage)则使用 3t -t。
与 3t 任何 3tshell 命令相同,但运行 CA AppLogic® shell 并启用 ssh pseudo-terminal,启用交互模式。
调用交互式 CA AppLogic® shell。
设置当前应用。 其与交互式 shell 中的“ca”命令工作方式相同。 执行 3t ca myapp 不起作用,因为 CA AppLogic® shell 的新实例通过每次调用“3t”命令来启动。
打印当前应用的名称(如 ca 所设置)
对当前应用或指定应用中正在运行的组件打开交互式 shell。 component 是实例在应用层次结构中的全称。 可以忽略最顶层组件集 (main.) 的名称,例如:以下内容是等效的:
assh the-app:main.web.srv1 ca the-app ; assh web.srv1
在组件实例上运行非交互式命令。 注意:对于 CA AppLogic® 的旧版本 (1.x),命令名称和参数不能包含空格,即,下面的示例不能产生预期的结果:
assh web.srv1 cat "名称中包含空格的文件".
如果在旧版本的网格中必须如此,则编写简短的脚本,并使用下面的 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® 网格“maintainer”访问权限的情况(例如:如果您安装了该网格)。在此类情形中,您具有 SSH 密钥,可以对控制器进行根级别访问,而不是作为一般的“client”工作时所需的访问权限。
要对 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 代理所提供的任何密钥;禁用严格主机身份检查(仅当您经常从头开始重新安装网格,从而导致控制器的 SSH ID 每次都发生更改时,才使用最后一个选项)。
快速、方便地访问主 SSH 会话
在 rmacros.sh 中定义的函数使用 OpenSSH 客户端的主会话功能。 运行的第一个命令将在“主服务器”模式下启动后台 ssh 客户端,所有后续命令使用“主服务器”所维护的会话来在同一个安全通道上运行其他 ssh 会话。
这具有两个优点:首先,只需要键入一次密码来访问 SSH 私钥,在此之后,会话将保持开放状态,不需要进行多次登录。
其次,这使得“ssh”的新调用与为已经开放的 SSH 会话键入命令一样快,而实际上要更快,因为在您按下 Enter 键时命令只发送一次,而在您键入命令时,交互式会话是逐个字符进行回应。
此外,从您的 shell 而不是 3tshell 控制台在本地运行命令时,允许使用 shell 的全部功能,以构成使用交互式 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 Support 不会为其提供帮助、更新或即时修正。 在 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
|
版权所有 © 2013 CA。
保留所有权利。
|
|