転載・引用について

ユーザ用ツール

サイト用ツール


サイドバー

Site Contents Index

転載・引用について

RSS

imprement:remexec

remexec(Dis-Continued)

Notice

remexecはCEoRとして書き換えました。以下今後はメンテナンスされません。

世間には FabricやらAnsibleやらchefやらの構成管理系ツールが溢れているが、個人的に以下の点が気に入らない。

  • PythonなりRubyが必須
  • 場合によってRemoteにツールを入れる必要がある
  • FreeBSDへの対応が甘い

仮想環境において、VMを作ったり消したり等の管理をしようと思った時に、「黙って手作業」とか辛すぎるので、以下の方針でツールを作ることにした。

  • 基本、余計なpackagesを導入しない
    • shell scriptベースで実装する
    • remote側にはsshdが動作している以上の要求をしない
    • できるだけ、余計な入力を排除する
    • FreeBSDの場合、流石に、sudoだけは許容する
  • 実行は基本的にshell scriptベース
    • 実行したい手順は全てshell scriptとして記述する
    • scpでshell scriptをコピーして、それをリモートで実行する
  • 手動入力は出来る限り排除する
    • scriptに記載する

remexecは、上記方針のもとで作る構成管理スクリプト群のうちの、リモートでscriptを実行するためのツールである

前提条件

現時点の前提条件を記載する。

  • targetにsshを利用してlogin可能であること
    • 作業用のlogin Userを準備することが望ましい
  • targetでは、sudoが動作すること
    • sudoers.d配下に以下のようなエントリーを記載してあるとなお良い
    • idempotence
      idempotence ALL=(root) NOPASSWD: ALL
  • 以上の要件を満たしたTemplateを作成しておくと便利

Commandline

$ remexec -h host [-u user] recipie.sh

Code

remexec.sh
#! /bin/sh -f
##############################################################################
#
# remexec
#
##############################################################################
 
##### Parse Option ###########################################################
while getopts "h:u:" FLAG; do
  case ${FLAG} in
  h) TARGET="${OPTARG}" ;;
  u) REMUSER="${OPTARG}@" ;;
  esac
done
shift $(( ${OPTIND} - 1 ))
 
SCRIPTS="${@}"
 
if [ -z "$TARGET" -o -z "${SCRIPTS}" ]; then
  echo >&2 "Usage: $0 -h Target [-u user] scripts"
  exit 1
fi
 
if [ -z "${REMUSER}" ]; then
  REMUSER="${USER}@"
fi
 
##### Check Scripts ##########################################################
ERROR=0
for i in ${SCRIPTS}; do
  if [ ! -e "${i}" ]; then
    echo "Error ${i} is not exist"
    ERROR=1
  fi
done
 
if [ ${ERROR} -ne 0 ]; then
  exit 1
fi
 
unset ERROR
 
##### Generate Scripts #######################################################
atexit() {
  [ ! -z "${TMPFILE}" ] && rm -f "${TMPFILE}"
}
trap atexit EXIT
trap 'trap - EXIT; atexit; exit -1' INT PIPE TERM
 
TMPFILE=$(mktemp)
 
cat << __END__ >> ${TMPFILE}
#! /bin/sh
##### Preamble
SUDO=`which sudo`
[ -z "\${SUDO}" ] && echo "Do not have sudo!. exit" && exit 1
__END__
 
for i in ${SCRIPTS}; do
  echo "##### from ${i}" >> ${TMPFILE}
  cat ${i} >> ${TMPFILE}
done
 
##### Execute Scripts ########################################################
TGTSCR=`ssh -q ${REMUSER}${TARGET} mktemp`
scp -q -rp ${TMPFILE} "${REMUSER}${TARGET}:${TGTSCR}"
ssh -q -t "${REMUSER}${TARGET}" "/bin/sh ${TGTSCR}"
ssh -q "${REMUSER}${TARGET}" "/bin/rm ${TGTSCR}"
このウェブサイトはクッキーを使用しています。 Webサイトを使用することで、あなたはあなたのコンピュータにクッキーを保存することに同意します。 また、あなたはあなたが私たちのプライバシーポリシーを読んで理解したことを認めます。 同意しない場合はウェブサイトを離れてください。クッキーに関する詳細情報
imprement/remexec.txt · 最終更新: 2018/07/03 18:02 by seirios