Bashをテンプレートツールとして使用するときに最初のエラーが発生したときに失敗する方法

Bashをテンプレートツールとして使用するときに最初のエラーが発生したときに失敗する方法

より良いバージョンを探していますset -e。よりよい版はきちんと働く™。私は簡単に読んだバッシュFAQ/105そして試したこのクレイジーなアプローチしかし、エラーが原因で失敗する方法はまだわかりません。

私のユースケースは、次のテンプレートからテキストファイルを生成したいことです。

#!/usr/bin/env bash

# none of these options helped to get the behavior I want: stop on first error
# set -euo pipefail
# shopt -s inherit_errexit
# set -o errexit
# trap ERR

cat <<< "
MYAPP_DATABASE_PASSWORD=$(pwgen -1 32)

MYAPP_USER_PASSWORD=$(pwgen -1 8)

MYAPP_CONFIGURATION_DATE=$(date --utc --iso-8601=ns)
"

または、この方法同意することもできます(template.txtテキストファイルを含む)。ここにある文字列上から):

#!/usr/bin/env bash

# none of these options helped to get the behavior I want: stop on first error
# set -euo pipefail
# shopt -s inherit_errexit
# set -o errexit
# trap ERR

while read line; do
    [ -z "$line" ] || echo "# $line"
    cmd="echo $line"
    outline=$(eval $cmd)
    exitstatus=$?
    echo "$outline"
    echo "# exit status was $exitstatus"
done < "template.txt"

pwgen残念ながら、次の要件のため、上記のアプローチのどれも私には適していません。コマンドの置き換えが失敗した場合(たとえば、見つからないため)、すべてがクラッシュしたいと思います。 1つ以上のエラーがあってはいけません。

他の技術では、所望の動作がデフォルト値である。

# this is an erb file                    
<%
require 'securerandom'
require 'date'
%>

MYAPP_DATABASE_PASSWORD=<%= SecureRandom.alphanumeric(32) %>

MYAPP_USER_PASSWORD=<%= SecureRandom.alphanumeric(8) %>

MYAPP_CONFIGURATION_DATE=<%= DateTime.now.new_offset.iso8601(6) %>

スペルエラーがある場合はSecureRandomすぐに終了しerbて失敗します。

Bashを使用して、これらの障害が発生した場合の競合動作をどのように達成できますか?

ベストアンサー1

別のオプションは、次の構成ツールを使用することです。アンシプールこれにより jinja2 を使用できます。金型、生成されたファイルを使用するアプリケーションに一種の構成確認がある場合は、生成されたファイルを確認することもできます。

- name: Update sshd configuration safely, avoid locking yourself out
  template:
    src: etc/ssh/sshd_config.j2
    dest: /etc/ssh/sshd_config
    owner: root
    group: root
    mode: '0600'
    validate: /usr/sbin/sshd -t -f %s
    backup: yes

おすすめ記事