[シェルスクリプト] 複数台あるEC2サーバーのユーザー一覧(棚卸)を作成するシェルスクリプト

スポンサーリンク
シェル

やりたいこと

イメージ

複数台の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

コメント

タイトルとURLをコピーしました