Ubuntu 16.04 サーバーの preseed/late_command のデバッグ: tee が見つからない、またはディレクトリが存在しない

Ubuntu 16.04 サーバーの preseed/late_command のデバッグ: tee が見つからない、またはディレクトリが存在しない

私は、Ubuntu 16.04 サーバー マシンで次の preseed ファイルを実行しようとしています (packer ビルド中)。

d-i preseed/late_command string \
in-target mkdir -v -p -m 0440 "/etc/sudoers.d"; \
in-target echo "%vagrant ALL=(ALL) NOPASSWD: ALL" | tee -a /etc/sudoers.d/vagrant; \
in-target echo "Defaults:vagrant !requiretty" | tee -a /etc/sudoers.d/vagrant; \
in-target chmod 440 /etc/sudoers.d/vagrant;

/var/log/installer/syslog に次のエラーが表示されます。

log-output: sh:
log-output: tee: not found

「| tee -a」の部分を「>>」に次のように変更します。

d-i preseed/late_command string \
in-target mkdir -v -p -m 0440 "/etc/sudoers.d"; \
in-target echo "%vagrant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/vagrant; \
in-target echo "Defaults:vagrant !requiretty" >> /etc/sudoers.d/vagrant; \
in-target chmod 440 /etc/sudoers.d/vagrant;

突然、mkdir 行については何も言わずに、ディレクトリが見つからないというエラーが出始めます。つまり、ディレクトリが作成されていないし、見つからないわけでもありません。

log-output: sh: can't create /etc/sudoers.d/vagrant: nonexistent directory
log-output: sh: can't create /etc/sudoers.d/vagrant: nonexistent directory
log-output: chmod:
log-output: cannot access '/etc/sudoers.d/vagrant'
log-output: : No such file or directory

私は github 上の他のスクリプトを調べてきました。また、preseed.cfg ファイルに次の行を追加しました。

d-i pkgsel/include string openssh-server coreutils wget sudo

tee が使用可能であることを確認するために、coreutils をターゲット内コマンドとしてインストールしようとしました。数日間この状態が続いていて、何度も Ubuntu を再構築しましたが、syslog に同じエラーが見つかりました。誰かこの件について説明できる人がいたら教えてください。単純なことのはずですが、私にはわかりません...

答え1

2つのこと:

  1. リダイレクトを実行すると、in-target some_command > /some/pathターゲット内ではリダイレクトは発生しません。次の操作を行う必要があります。in-target --pass-stdout some_command > /target/some/path

  2. コマンドin-targetは、コマンドからの出力をログファイルにリダイレクトします。そのため、出力をリダイレクトしようとすると、デフォルトでは機能しません。必要なのは、 in-targetへの引数in-targetを使用することです。--pass-stdout

in-target --pass-stdout echo "hello" > /target/root/hello.txt

これにより、コンテンツ「hello」を含むファイル/target/root/hello.txtが作成されます。

から:https://salsa.debian.org/installer-team/debian-installer-utils/-/blob/3e67bc7987eb4a9cdff5fe8d1084e612fe7bb48f/README

in-target: 指定されたコマンドを /target で実行し、その終了ステータスを返します。debconf パススルー フロントエンドは、インストーラーで cdebconf を使用して debconf の質問を行うために使用されます。これは、dpkg-reconfigure、debconf-apt-progress、tasksel などを実行する場合に特に便利です。log-output ユーティリティは、出力をログに記録するために使用されます。in-target がオプション --pass-stdout で呼び出された場合、log-output はそれを尊重します。

答え2

echointoを使用しても機能しないようですin-target。これを解決するには、以下を試してください (Ubuntu 18.04 で試しました)。

d-i preseed/late_command string \
    echo "some text" >> /target/path/to/file.ext ; \
    in-target [some-other-command-in-target]

注記:

  • in-target行の前には使用しないでください
  • /target実際のパスの前に使用
  • in-target他のコマンドでは、ほとんどの場合、行の前に使用できます

答え3

Debian インストーラーを使用する場合は、17.10.1 サーバーで authorized_keys に ssh 公開キーを追加するときにこれが機能しました。.ssh ディレクトリが事前に作成されていることを確認する必要があります。

d-i preseed/late_command string in-target /bin/sh -c 'echo "my string" >> /home/username/.ssh/authorized_keys';

私はこれをデバッグするのに約 1 日を費やし、さまざまな結果を得るために次のことを試しました。Debian インストーラーでさまざまな non/'in-target' ディレクティブに使用されるシェルに関するより詳細なドキュメントがあればよいのですが、おそらく適切な場所を探していないのでしょう。

  1. プレーン authorized_keys パスを使用したプレーンなターゲット内エコー:

    in-target echo "my string" >> /home/username/.ssh/authorized_keys;
    

    「ディレクトリが見つかりません」と表示されます/var/log/installer/syslog

  2. ターゲット authorized_keys パスを含むプレーンなターゲット内エコー:

    in-target echo "my string" >> /target/home/username/.ssh/authorized_keys;
    

    ターゲットマシン上に空のauthorized_keysファイルを生成し、表示すると/var/log/installer/syslog「my string」が出力されます。stdout

  3. sh -c...明示的かつターゲットの authorized_keys パスを持つ in-target :

    in-target /bin/sh -c 'echo "my string" >> /target/home/username/.ssh/authorized_keys';
    

    「ディレクトリが見つかりません」というエラーが発生します/var/log/installer/syslog

これで時間とデバッグの時間が少し節約できると思います。

答え4

echo は、in-target ディレクティブ内から機能します。バックティック (`) を付けて記述する必要があります。たとえば、preseed ファイルからマシンのホスト名を更新したいとします。

ターゲットホスト名echo "ubn"$(lshw | grep -m 1 serial | awk '{print tolower ($2)}')

バックティックは、これを 1 つのコマンドとして実行するようにシェルに指示します。

関連情報