時には、どの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エンジニアだったら)

さあ、設定を征服しに行きましょう!