上一主题: 全局用户和组

下一主题: 应用和组件锁定


高级用法

如果使用的是 GNU Bash,还可以使用客户端宏直接从您自己的 Linux 计算机或运行在网格上的 VDS 类型 Linux 服务器上访问 CA AppLogic shell 命令。

客户端宏

使用适用于 GNU Bash 和 OpenSSH 客户端的客户端宏,可以轻松地直接从本地 shell 提示符访问 3tshell(CA AppLogic 命令行界面)的所有功能。

功能:

要在您的系统上使用该文件,请执行以下操作:

  1. 确保具有 GNU Bash 2.0 或更高版本以及 OpenSSH 客户端程序 (ssh) 3.9 或更高版本。
  2. 复制 rmacros.sh 主题的内容,并将其粘贴到您自己的 .sh 文件。
  3. 将该文件命名为 rmacros.sh。
  4. 将其保存在磁盘上。
  5. 使用 source 命令将其包括在您的 shell 中。

也可以在 .bashrc 文件中执行此步骤,以使其可用于您启动的每个交互式 shell 实例。

一旦加载 rmacros.sh 文件,以下命令即变为可以从 shell 提示符中使用。 相同的命令也可以用在非交互式脚本中,为此,您只需通过“source”命令从脚本添加 rmacros.sh 文件:

controller hostname-or-ip

设置后续命令将定向到的控制器的主机名。 此操作必须在使用任何其他命令前完成。

controller

与控制器断开连接。 这样将关闭与控制器的主要 ssh 会话。

3t 任何 3tshell 命令

这相当于在 CA AppLogic shell 提示符处键入命令。 这种形式对于简单命令以及无人干预的批量操作很有用。 需要用户干预的命令(例如:vol manage)则使用 3t -t。

3t -t 任何 3tshell 命令

与 3t 任何 3tshell 命令相同,但运行 CA AppLogic shell 并启用 ssh pseudo-terminal,启用交互模式。

3t

调用交互式 CA AppLogic shell。

ca appname

设置当前应用。 其与交互式 shell 中的“ca”命令工作方式相同。 执行 3t ca myapp 不起作用,因为 CA AppLogic shell 的新实例通过每次调用“3t”命令来启动。

pwa

打印当前应用的名称(如 ca 所设置)

assh [appname:]component

对当前应用或指定应用中正在运行的组件打开交互式 shell。 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 "名称中包含空格的文件". 

如果在旧版本的网格中必须如此,则编写简短的脚本,并使用下面的 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 网格“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 

此部分包含以下主题:

rmacros.sh 示例

rmacros.sh 示例

注意:此处提供的代码为示例,说明对通过 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