問題
変数の値に基づいて実行することを期待している case ステートメントを含むスクリプトがあります。case ステートメントは、値を無視するか、適切に評価せず、代わりにデフォルトにドロップするように見えます。
シナリオ
サーバーのホスト名から、サーバーが存在する環境内の場所を示す特定の文字を取り出します。6 つの異なる場所があります。
- 管理 (m): 監視、電子メール、チケット発行などのインフラストラクチャの一部であるサーバー
- 開発 (d): コードおよびアプリケーション機能を開発するためのサーバー
- Test(t): コードおよびアプリケーション機能の初期テストに使用されるサーバー
- 実装 (i): 本番前の評価のためにコードがプッシュされるサーバー
- Production(p): 自明
- サービス: プロジェクト全体で機能を提供する、顧客が統合する必要があるサーバー。これらはお客様のサーバーであるという点で管理サーバーとは別のものであり、管理サーバーは当社が所有および運営しています。
ホスト名から文字を取り出した後、それを case ブロックに渡します。case ブロックが文字を評価し、数行のテキストを rsyslog.conf ファイルに追加することを期待しています。代わりに、大文字と小文字が認識されないため、サーバーを構築する人にエントリを手動で構成するように指示するだけのデフォルトを返します。
最近構築したサーバーに対してこれを手動でテストし、ホスト名から取得している文字 (「s」) が想定されていて、case ブロックで説明されていることを確認しました。
コード
# Determine which environment our server resides in
host=$(hostname -s)
env=${host:(-8):1}
OLDFILE=/etc/rsyslog.conf
NEWFILE=/etc/rsyslog.conf.new
# This is the configuration we need on every server regardless of environment
read -d '' common <<- EOF
...
TEXT WHICH IS ADDED TO ALL CONFIG FILES REGARDLESS OF FURTHER CODE EXECUTION
SNIPPED
....
EOF
# If a server is in the Management, Dev or Test environments send logs to lg01
read -d '' lg01conf <<- EOF
# Relay messages to lg01
*.notice @@xxx.xxx.xxx.100
#### END FORWARDING RULE ####
EOF
# If a server is in the Imp, Prod or is a non-affiliated Services zone server send logs to lg02
read -d '' lg02conf <<- EOF
# Relay messages to lg02
*.notice @@xxx.xxx.xxx.101
#### END FORWARDING RULE ####
EOF
# The general rsyslog configuration remains the same; pull it out and write it to a new file
head -n 63 $OLDFILE > $NEWFILE
# Add the common language to our config file
echo "$common" >> $NEWFILE
# Depending on which environment ($env) our server is in, add the appropriate
# remote log server to the configuration with the $common settings.
case $env in
m) echo "$lg01conf" >> $NEWFILE;;
d) echo "$lg01conf" >> $NEWFILE;;
t) echo "$lg01conf" >> $NEWFILE;;
i) echo "$lg02conf" >> $NEWFILE;;
p) echo "$lg02conf" >> $NEWFILE;;
s) echo "$lg02conf" >> $NEWFILE;;
*) echo "Unknown environment; Manually configure"
esac
# Keep a dated backup of the original rsyslog.conf file
cp $OLDFILE $OLDFILE.$(date +%Y%m%d)
# Replace the original rsyslog.conf file with the new version
mv $NEWFILE $OLDFILE
さておき
| を使用して、ケース ブロックのさまざまなコード グループを 1 行 (合計 2 行) に結合できることは既に確認済みです。オペレーター。問題が発生している間、これがコード化されているため、上記の方法でリストしました。