やりたいこと
イメージ
複数台のEC2サーバー(Linux)を利用しているのですが、定期的にユーザーの棚卸をしています。
これまでは、各サーバーにsshで接続して、/etc/passwdファイルを参照して一覧を作成していました。具体的には、以下のコマンドを打っていました。
# ssh -i pemファイル ホスト名
# cat /etc/passwd
さすがに複数台サーバーがあると面倒なので、自動化することにしました。
ユーザー一覧を作成する方針
以下のファイルを作成して、自動化することにしました。
- server_list.conf
ユーザー一覧を取得したいサーバーの情報が入っている設定ファイル。CSV形式。 - get_user_list.sh
ユーザー一覧ファイルを出力するシェルスクリプト。
ユーザー一覧を作成するシェルスクリプト
server_name1,{pemの置き場}/server_name1.pem,user1@xx.xx.xx.xx
server_name2,{pemの置き場}/server_name2.pem,user2@xx.xx.xx.xx
server_name3,{pemの置き場}/server_name3.pem,user3@xx.xx.xx.xx
#!/bin/bash
if [[ $1 = "-h" ]];then
echo
echo
echo Usage
echo get_user_list.sh
echo
echo server_list.confファイルを読み込んで
echo 各サーバーのアカウントリストを取得します。
echo 「user_list_」+「yyyymmdd」.csv で出力します。
exit 0
fi
export CONF_FILE="server_list.conf"
export YMD=`date "+%Y%m%d"`
export OUT_FILE="user_list_${YMD}.csv"
rm -rf $OUT_FILE
while read line; do
export TARGET_NAME=`echo ${line} | cut -d , -f 1`
export TARGET_KEY=`echo ${line} | cut -d , -f 2`
export TARGET_HOST=`echo ${line} | cut -d , -f 3`
export GET_CMD="cut -d: -f1 /etc/passwd"
export TMP_FILE="${TARGET_NAME}_${YMD}.csv"
# sshコマンドでユーザー一覧を取得し、TMPファイルに出力
ssh -n -i $TARGET_KEY $TARGET_HOST $GET_CMD > $TMP_FILE
# 先頭行にサーバー名を付与してファイル出力
sed "s/^/${TARGET_NAME},/g" $TMP_FILE >> $OUT_FILE
rm -rf $TMP_FILE
done < $CONF_FILE
※開発途中、whileループが1回しか実行されない事象に遭遇しました。それについては、以下に書いてます。
実行結果
実行文
# ./get_user_list.sh
出力結果
# cat user_list_yyyymmdd.csv
server_name1,root
server_name1,hoge1
・
・
・
server_name2,root
server_name2,hoge2
・
・
・
server_name3,root
server_name3,hoge3
コメント