1. 1個のファイルにまとめる
    • 複数ファイルにする

    サーバーを複数運用していると、複数サーバーで同じコマンドを実行して結果を取得したい場合があります。 その場合、手動で各サーバーにsshでログインしてコマンドを実行すると、サーバー台数が多い場合に手間です。 ここでは、そのような場合に使用できるスクリプトについて説明します。

    スクリプトは、以下の2つの機能を組み合わせたものになります。

    注意 sshのログインは、鍵認証だけでログインできるようにすると、パスワード入力が無くなり、cronで自動実行することが可能となります。

    1個のファイルにまとめる

    以下のように対象サーバーの定義と、コマンドを1つのスクリプトにまとめます。

    #!/bin/bash
    
    # サーバー定義
    HOSTS=(
    user@orange.example.com
    user@apple.exampl.com
    
    #コメント
    test@grape.example.com
    
    )
    
    OUTPUT="$0.`date +%Y%m%d`.txt"
    
    
    #同じ日に何回実行しても最後の結果だけをファイルにする
    :> $OUTPUT
    
    
    for host in "${HOSTS[@]}"
    do
        echo $host >> $OUTPUT
    
        # SSHでログインしてコマンド実行
        ssh $host 'df -h' >> $OUTPUT
    
        echo >> $OUTPUT
    done
    赤色の個所がサーバー定義と、実行コマンドになります。

    実行すると、HOSTSの3サーバーでdfコマンドを実行して、その結果をファイルにします。

      複数ファイルにする

      対象サーバーは同じで、異なるタイミングで実行したい複数のコマンドがある場合、対象サーバーの定義ファイルと、実行コマンド用スクリプトを分けたほうが管理が楽になります。

      ここでは、月末に実行するコマンドと、週一で実行するコマンドがあるケースを考えます。 その場合、以下のような3つのファイルに分けられます。

      • サーバー定義ファイル

      • サーバーを配列で定義しただけファイルhosts.sh のサンプルは以下のようになります。

        例 hosts.sh
        #!/bin/bash
        
        HOSTS=(
        user@orange.example.com
        user@apple.exampl.com
        
        #コメント
        test@grape.example.com
        
        )
        "#"から始まるとコメントになります。 また、改行のみの行を入れることも可能なので、サーバーの数が多い場合は、適度に改行だけの行やコメントを入れて分かりやすくします。

      • コマンド実行用ファイル

      • 月末と週一で実行されるファイルの中身は以下のようになります。

        #!/bin/bash
        
        # 対象サーバーの定義ファイルを読み込んで、変数HOSTSに配列で定義
        . hosts.sh
        
        # 結果を保存するファイル名を指定
        OUTPUT="$0.`date +%Y%m%d`.txt"
        
        
        :> $OUTPUT
        for host in "${HOSTS[@]}"
        do
            echo $host >> $OUTPUT
        
            # SSHでログインしてコマンド実行
            ssh $host '[コマンド]' >> $OUTPU
        
            echo >> $OUTPUT
        done

        こうすれば、対象サーバーが増えたり、減ったりしてもhosts.shだけの編集で対応できます。 また、各サーバーにスクリプトを置く必要が無いので、スクリプトの管理も楽になります。

        例 週一で/tmpと/homeの容量を確認するスクリプト weekly.sh
        #!/bin/bash
        
        # 対象サーバーの定義ファイルを読み込んで、変数HOSTSに配列で定義
        . hosts.sh
        
        # 結果を保存するファイル名を指定
        OUTPUT="$0.`date +%Y%m%d`.txt"
        
        
        :> $OUTPUT
        for host in "${HOSTS[@]}"
        do
            echo $host >> $OUTPUT
            ssh $host 'du -h -d0 /tmp' >> $OUTPUT 
            ssh $host 'du -h -d1 /home' >> $OUTPUT 
            echo >> $OUTPUT
        done