このドキュメントで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 .......

答え2

を使用すると、<<something行の先頭に「何か」が表示されるまで何かを説明します。

たとえば、$varこれを$ var値として解釈して$ var値に置き換えるか、次のようにします。$( some shell script here possibly multiline, or with ; or with pipes, all will be interpreted and the resulting output placed as its place in the heredocument )

たとえば、

cat <<EOF
  Hello, I am process $$ running on $( hostname ), and here is a few informations about it:
$( printf "%s\n" "$PATH" | tr ':' '\n' | while read dir; do
    printf "PATH entry %-40s: is on %s filesystem" "$dir" "$( df "$dir" | tail -n 1  | awk '{print $NF}' )"
   done
)
EOF

# this will output something like :
Hello, I am process 25592 running on myhostname, and here is a few informations about it:
PATH entry /usr/local/bin                          : is on / filesystem
PATH entry /usr/bin                                : is on /usr/bin filesystem
...

この例はひどいですが、シェルがheredoc内でそれを解釈していることを示しています。

説明したくない場合は、以下を使用できます。 << 'something'

cat <<'EOF' # only line different from previous ex.
  Hello, I am process $$ running on $( hostname ), and here is a few informations about it:
$( printf "%s\n" "$PATH" | tr ':' '\n' | while read dir; do
    printf "PATH entry %-40s: is on %s filesystem\n" "$dir" "$( df "$dir" | tail -n 1  | awk '{print $NF}' )"
   done )
# will output:
  Hello, I am process $$ running on $( hostname ), and here is a few informations about it:
$( printf "%s\n" "$PATH" | tr ':' '\n' | while read dir; do
    printf "PATH entry %-40s: is on %s filesystem\n" "$dir" "$( df "$dir" | tail -n 1  | awk '{print $NF}' )"
   done )

はい、 cat <<somethingheredoc出力の一部の内容に色を付けるなど、他の操作を行で実行できます。

cat <<something | grep -E --color=always '^|this_will_be_red|this_too'
blah blih
and this_will_be_red ...
and other things
and this_too will be red
foo bar
something

関連情報