時には、どのUnix系システムでも動作する軽量で依存関係のないソリューションが必要です。そんな時に活躍するのがsedとawkです。
- ほぼすべてのUnix系システムで利用可能
- 追加のインストールや依存関係が不要
- 即時の変更に対する高速な実行
- 複雑な変換を処理するのに十分なパワー
実践でのダイナミックデュオ
実際のシナリオから始めましょう。環境変数とテンプレートに基づいてNginxの設定ファイルを動的に生成する必要があります。以下が使用するテンプレートです。
server {
listen 80;
server_name {{SERVER_NAME}};
location / {
proxy_pass {{UPSTREAM_URL}};
}
}
次に、sedを使ってこれらのプレースホルダーを実際の値に置き換えます。
#!/bin/bash
SERVER_NAME="example.com"
UPSTREAM_URL="http://backend:8080"
sed -e "s/{{SERVER_NAME}}/$SERVER_NAME/g" \
-e "s|{{UPSTREAM_URL}}|$UPSTREAM_URL|g" \
nginx.template > nginx.conf
このスクリプトはテンプレートを読み込み、プレースホルダーを置き換えて新しい設定ファイルを出力します。簡単ですよね?でも、もっと複雑なことが必要な場合はどうでしょうか?
レベルアップ:マルチサーバー設定
バックエンドサーバーのリストがあり、アップストリームブロックを動的に生成したいとします。ここでawkが本領を発揮します。
#!/bin/bash
SERVERS="server1:8080 server2:8081 server3:8082"
echo "upstream backend {"
echo "$SERVERS" | awk '{
split($0, servers, " ")
for (i in servers) {
split(servers[i], parts, ":")
printf " server %s:%s;\n", parts[1], parts[2]
}
}'
echo "}"
このスクリプトは次のようなアップストリームブロックを生成します。
upstream backend {
server server1:8080;
server server2:8081;
server server3:8082;
}
物語は続く:条件付き設定生成
次に、sedとawkを組み合わせて、より動的な設定を生成します。環境に基づいて異なる設定を生成するスクリプトを作成します。
#!/bin/bash
ENV=${1:-production}
TEMPLATE="nginx.template"
# 環境に基づいてサーバーリストを生成
if [ "$ENV" = "production" ]; then
SERVERS="prod1:8080 prod2:8080 prod3:8080"
else
SERVERS="dev1:8080"
fi
# アップストリームブロックを生成
UPSTREAM=$(echo "$SERVERS" | awk '{
print "upstream backend {"
split($0, servers, " ")
for (i in servers) {
split(servers[i], parts, ":")
printf " server %s:%s;\n", parts[1], parts[2]
}
print "}"
}')
# テンプレートのプレースホルダーを置き換え
sed -e "s/{{ENV}}/$ENV/g" \
-e "s|{{UPSTREAM_BLOCK}}|$UPSTREAM|g" \
"$TEMPLATE" > "nginx_$ENV.conf"
このスクリプトは環境を引数として受け取り、適切なアップストリームブロックを生成し、sedを使って最終的な設定に挿入します。
注意すべき落とし穴
sedとawkは強力ですが、いくつかの癖があります。
- 置換時の特殊文字に注意。必要に応じて異なる区切り文字(例えば/の代わりに|)を使用してください。
- awkのデフォルトのフィールド区切り文字は空白です。必要に応じて-Fで変更してください。
- sedは入力を行ごとに処理するため、いくつかの操作が制限されることがあります。
さらに進む
これらの基本をマスターしたら、さらに印象的なことができます。
- サービスディスカバリーデータに基づいて複雑なHAProxy設定を生成
- 複数の設定ファイルにわたってデータベース接続文字列を動的に更新
- コンテナ起動時に環境固有のアプリケーション設定を作成
まとめ
Sedとawkは過去の遺物のように見えるかもしれませんが、現代のDevOpsプラクティスにおいて非常に重要です。依存関係なしに複雑なテキスト変換を迅速に行う能力は、動的な設定管理において非常に貴重なツールです。
次回、設定の悪夢に直面したときは、重厚な設定管理システムに手を伸ばす前に、少しのsedとawkの魔法が必要なだけかもしれません。
"私にsed、awk、そして立つ場所を与えれば、私は世界を動かす。" - アルキメデス(もし彼がDevOpsエンジニアだったら)
さあ、設定を征服しに行きましょう!