Saya bingung dengan awk dalam skrip titik masuk buruh pelabuhan saya (alpine busybox).

Target saya adalah meneruskan argumen ke arahan server upstream nginx. Jadi saya punya file template:

upstream config {
  ip_hash;
  server $UPSTREAMS:18280;
}

upstream application {
  ip_hash;
  server $UPSTREAMS:18380;
}
.... and so on ....

Seperti yang Anda lihat aplikasi dan DB tidak ada di buruh pelabuhan (jika tidak, saya hanya akan menggunakan traefik).

File konfigurasi akhir akan terlihat seperti ini (berdasarkan variabel env yang diteruskan):

upstream config {
  ip_hash;
  server node1.somewhere:18280;
  server node2.somewhere:18280;
  server node3.somewhere:18280;
}

upstream application {
  ip_hash;
  server node1.somewhere:18380;
  server node2.somewhere:18380;
  server node3.somewhere:18380;
}
.... and so on ....

Masalahnya adalah jumlah "server" (node) dapat berubah seiring waktu dan penggunaan, misalnya:

  • Menjalankan wadah buruh pelabuhan nginx oleh pengembang di workstation (1 node)
  • Lingkungan pengembang (1-2 node)
  • Uji env (2 node)
  • Prod env (3 node)
  • dan seterusnya ...

Dan percobaan skrip entrypoint terbaru saya:

#!/bin/busybox sh
array=${UPSTREAMS//;/ }
set -- $array

while [ -n "$1" ]; do
    server_node=$1
    awk '/\$UPSTREAMS/ { print; gsub("\\$UPSTREAMS", "$server_node")};1' upstreams.template > upstreams.intermediate
    shift
done

Terima kasih atas bantuannya :)

PS: Maaf karena konten variabel v UPSTREAMS hilang:

ENV UPSTREAMS="node1;node2;node3"

VERSI KERJA

Berkat Ed Morton saya dapat memperbaiki skrip:

#!/bin/busybox sh
export UPSTREAMS
export SERVER

upstreams=${UPSTREAMS//;/ }
set -- $upstreams

while [ -n "$1" ]; do
    server=$1
    awk -v var="$server" '/\$UPSTREAMS/ { print; gsub(/\$UPSTREAMS/, var)};1' /etc/nginx/templates/upstreams.template > /tmp/tmp \
      && mv /tmp/tmp /etc/nginx/templates/upstreams.template
    shift
done

awk '!/\$UPSTREAMS/' /etc/nginx/templates/upstreams.template
mv  /etc/nginx/templates/upstreams.template /etc/nginx/conf.d/upstreams.final
.....

Keluaran:

upstream config {
  ip_hash;
  server node3:18280;
  server node2:18280;
  server node1:18280;
}

Terima kasih banyak untuk komentar Anda :)

1
Facty 2 Juli 2020, 14:21

1 menjawab

Jawaban Terbaik
$ cat file
upstream config {
  ip_hash;
  server $UPSTREAMS:18280;
}

upstream application {
  ip_hash;
  server $UPSTREAMS:18380;
}

.

$ cat tst.sh
#!/usr/bin/env bash

UPSTREAMS='node1;node2;node3'

tmp=$(mktemp) || exit 1

awk -v upstreams="$UPSTREAMS" '
    BEGIN {
        numServers = split(upstreams,servers,/;/)
    }
    /\$UPSTREAMS/ {
        orig = $0
        for (serverNr=1; serverNr<=numServers; serverNr++) {
            server = servers[serverNr]
            $0 = orig
            sub(/\$UPSTREAMS/,server)
            print
        }
        next
    }
    { print }
' file > "$tmp" && mv -- "$tmp" file

.

$ ./tst.sh

$ cat file
upstream config {
  ip_hash;
  server node1:18280;
  server node2:18280;
  server node3:18280;
}

upstream application {
  ip_hash;
  server node1:18380;
  server node2:18380;
  server node3:18380;
}
$
0
Ed Morton 2 Juli 2020, 14:31