大抵の場合はテンプレート済みのファイルを配置するか他言語で行う。(どうしてもシェルでやりたいニッチ向けの記事です。)
※envsubstコマンドのインストールが別途必要。gettextの付属コマンドなのでこっちでも可。
POSIXの標準仕様外なので、最小インストール時は入っていない。
- 関数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
#!/bin/bash ###################################################################################### # 関数名: テンプレート更新処理関数 # # env: UPDATE_TEMPLATE_MODE # param1: テンプレートファイル # param2: プロパティファイル(※UPDATE_TEMPLATE_MODE=file) # param2: プロパティ(※UPDATE_TEMPLATE_MODE=property) # return: 無し ###################################################################################### function update_template() { local mode=$UPDATE_TEMPLATE_MODE local target=$1 shift if [ -d $target ]; then for src in $(find $target -name '*.*'); do sources[${#sources[@]}]=$(echo $src) done else for src in $(ls $target); do sources[${#sources[@]}]=$(echo $src) done fi for src in ${sources[@]}; do tmp_file=$(mktemp) cp -a $src $tmp_file case $mode in file ) { prop_file=$1 source $prop_file for line in $(cat $prop_file | grep -v -e '^$' -e '^#'); do keys[${#keys[@]}]=$(echo $line | cut -d '=' -f 1) done };; property ) { keys=($@) } esac # 埋込み文字の置換 {{key}} => $key for key in ${keys[@]}; do sed -i "s/{{${key}}}/\${${key}}/g" $tmp_file done # 埋込み文字の置換 $key => value ( export ${keys[@]} envsubst "$(for key in ${keys[@]} ; do echo -n "\$${key} " ; done)" < $tmp_file > $src ) rm -f $tmp_file keys=() done sources=() return 0 } source env-default.sh update_template /etc/supervisor/supervisord.conf PROG SUPERVISER_LOG_DIR update_template /etc/supervisor/conf.d/sshd.conf PROG SUPERVISER_LOG_DIR update_template /etc/supervisor/conf.d/nexus.conf PROG LOG_DIR DATA_DIR INSTALL_DIR APP_USER UPDATE_TEMPLATE_MODE=file update_template /etc/supervisor/supervisord.conf env.properties |
- プロパティファイル
env-default.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/bash ###################################################################################### # 環境変数 # ###################################################################################### UPDATE_TEMPLATE_MODE=$UPDATE_TEMPLATE_MODE:-property PROG=nexus APP_USER=nexus SONATYPE_DIR="/opt/sonatype" INSTALL_DIR="${SONATYPE_DIR}/nexus" DATA_DIR="${SONATYPE_DIR}/sonatype-work/nexus3" LOG_DIR="/var/log/${PROG}/${PROG}" SUPERVISER_LOG_DIR="/var/log/nexus/supervisor" |
- テンプレートファイル
/etc/supervisor/supervisord.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
; supervisor config file [unix_http_server] file = /var/run/supervisor.sock chmod = 0700 [supervisord] logfile = {{SUPERVISER_LOG_DIR}}/{{PROG}}-supervisord.log pidfile = /var/run/supervisord.pid childlogdir = {{SUPERVISER_LOG_DIR}} [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl = unix:///var/run/supervisor.sock [include] files = /etc/supervisor/conf.d/*.conf |
/etc/supervisor/conf.d/nexus.conf
1 2 3 4 5 6 7 8 9 10 11 12 |
[program:{{PROG}}] priority = 10 directory = {{INSTALL_DIR}} environment = LANG="C.UTF-8", JAVA_HOME="/opt/jdk", PATH="/opt/jdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" command = {{INSTALL_DIR}}/bin/{{PROG}} run user = {{APP_USER}} autostart = true autorestart = true stdout_logfile = {{LOG_DIR}}/%(program_name)s-stdout.log stderr_logfile = {{LOG_DIR}}/%(program_name)s-stderr.log |
/etc/supervisor/conf.d/sshd.conf
1 2 3 4 5 6 7 8 |
[program:sshd] directory = / command = /usr/sbin/sshd -D -E {{SUPERVISER_LOG_DIR}}/{{PROG}}-%(program_name)s.log user = root autostart = true autorestart = true stdout_logfile = {{SUPERVISER_LOG_DIR}}/{{PROG}}-%(program_name)s.log stderr_logfile = {{SUPERVISER_LOG_DIR}}/{{PROG}}-%(program_name)s.log |
UPDATE_TEMPLATE_MODEを「property」で動作させるメリットは、置換するプロパティをソースに明示できること。
大抵の場合は、「file」で良いと思います。parm1にディレクトリを指定するとディレクトリ配下のテンプレートファイルを検索して、テンプレート更新してくれるます。
実際使う時はデプロイ関数とセット使いが良いかも。
コメント