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}"
imprement/remexec.txt · 最終更新: 2018/07/03 18:02 by seirios