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 <<something
heredoc出力の一部の内容に色を付けるなど、他の操作を行で実行できます。
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