SSHを介してアクセスし、.confファイルのKey-Valueペア構成パラメータが設定されていることを確認する必要がある50のLinuxサーバーのリストがあります。キーと値のペアが存在することを確認する必要があります。キーと値のペアが存在する場合は、ブール値をFALSEに変更する必要があります。 Key-Valueペアが存在しない場合は、FALSEに設定された値でKey-Valueペアを生成する必要があります。
SSH部分には問題はありません。ここでドキュメントを使用してリモートサーバーでコマンドリストを実行します。ただし、この特定のソリューションでは、キーと値のペアを確認し、結果に応じて操作を実行するためにリモートサーバーにいくつかのbashロジックが必要です。このドキュメントにbashスクリプトロジックを統合する方法はありますか?そうでない場合、この特定のケースを処理する他の方法は何ですか?
各サーバーにbashスクリプトがあり、リモートサーバーに必要なロジックを実行するここでこのスクリプトを呼び出すことができると思いますが、追加ファイルを必要とせずに管理するスクリプトを探したいと思います。 50そのファイルのソリューションサーバー。
以下のサンプルコードは、いくつかの疑似コードを使用して実装しようとしているロジックを示しています。あなたの助けとアドバイスに事前に感謝します。
#! /bin/bash
SERVER_LIST=/path/to/servers_list.txt
for server in $(cat ${SERVER_LIST}); do
ssh ${server} <<CommandList
# if key-value pair exists in my.conf
# modify value to FALSE
# else
# add key-value pair with value set to FALSE
CommandList
done
構成ファイルの例
[general]
setting1 = true
setting2 = false
setting3 = true
ベストアンサー1
コメントで述べたように、より良い解決策はansible
。
別の解決策は、既存の方法を維持することです。トレドック、ファイルを正しく解析するには、次のものをTOML
使用できますawk
。
setting3
それが正しいfalse
かどうかをテストするにはtrue
(次にinの後に任意のロジックを適用できますif/then/else/fi
):
#! /bin/bash
while read -r server; do
ssh ${server} <<'CommandList'
if awk '($1 == "setting3"){exit ($3 == "true") ? 0 : 1}' file.toml; then
echo "true case"
else
echo "false case"
fi
CommandList
done < /path/to/servers_list.txt
TOML
代わりに実際のパーサーを好む場合awk
:
perl -MTOML::XS -MFile::Slurper -E '
my $file = shift;
my $toml = File::Slurper::read_binary($file)
or die "arg1 need to be TOML file\n";
my $struct = TOML::XS::from_toml($toml)->to_struct();
if ($struct->{general}->{setting3}) {
say "true";
exit 0;
}
else {
say "false";
exit 1;
}
' file.toml
別のTOML
パーサーはPythonの実装ですyq
(このgo
バージョンは解析しませんTOML
)。Python yq
編集する所定の位置に、あなたが利用できる
gawk -i inplace .......