1

それぞれのサーバーで定義されたサービスを再起動するスクリプトが必要です。以下のようにパラメータをスクリプトに渡したい:例:

sh execute.sh [server1:nginx,mysqld],[server2:mysqld,apache2],[server3:mongodb,apache2]

したがって、server1 に移動し、そこで nginx および mysqld サービスを再起動する必要があります。次にserver2に移動し、そこでmysqldとapacheを再起動する必要があります。

以下のようなスクリプトがあります。

#!/bin/bash
# create an array of server:services
a=($(echo "$1" | gawk 'BEGIN { FS="[]],[[]" } ; { print $1, $2, $3 }' | tr -d '[]'))
# add a for loop here to iterate values in array with code below
for var in "${a[@]}" ; do
# get server name
server1=$(echo $a[0] | cut -d ':' -f1)
# get your services as space separated
servs1="$(echo $a[0] | cut -d ':' -f2 | tr ',' ' ')"
# loop your services
for s in $servs1; do
  ssh $server1 "service $s restart"
done
done

上記のスクリプトは、最初のサーバー名とサービスのみを grep できます。他の人を得るのを手伝ってください。

元の質問:

4

2 に答える 2

2

配列、IFS、および for ループについて これを行うには何百万もの方法があります。私は配列が大好きなので、それらを使用しました。各サービスを個別に呼び出したいのか、一度にすべて呼び出したいのかわからなかったので、個別に呼び出しました。また、このメソッドから実行する単一のコマンドを簡単に作成することもできます。コンマを処理するように IFS を変更していることに気付くでしょう。サーバー間のブラケットと , を削除したので、次のように呼び出します。

呼び出しスクリプト:

./test2 server1:nginx,mysqld server2:sshd,apache2

コード:

    #!/bin/bash
    #-- samples: server1:nginx,mysqld server2:mysqld,apache2
    declare -a list
    read -a list <<< "${@}"
    echo ${list[@]}

    for (( i=0; i<${#list[@]}; i++ )) ;do

        IFS=' '
        server=$(echo ${list[$i]} | cut -d: -f1)
        services=$(echo ${list[$i]} | cut -d: -f2)

        IFS=,
        for each in $services ;do
            echo "Go To $server: restart $each"
        done

    done

出力:

    Go To server1: restart nginx
    Go To server1: restart mysqld
    Go To server2: restart sshd
    Go To server2: restart apache2
于 2013-10-15T20:32:36.140 に答える
1

なぜあなたは単に

while read host services; do
    for service in $services; do
        ssh "$host" service "$service" restart
    done
done <<____HERE
    server1 nginx mysqld
    server2 mysqld apache
    server3 mongodb apache2
____HERE
于 2013-10-15T19:56:21.930 に答える