このドキュメントでBashスクリプトロジックを使用できますか?

このドキュメントでBashスクリプトロジックを使用できますか?

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 .......

おすすめ記事