web-dev-qa-db-ja.com

ubuntu 16.04サーバーのpreseed / late_commandのデバッグ:tee not found vs non-existentディレクトリ

Ubuntu 16.04サーバーマシンで次のpreseedファイルを実行しようとしています(パッカービルド中):

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

ティーが利用可能であることを確認するために、ターゲット内コマンドとしてcoreutilsをインストールしようとしました。 Syslogで同じエラーを見つけるためだけに、数日間、これを繰り返し、ubuntuを再構築します。誰かがこれに光を当てることができれば-それは単純なものでなければなりませんが、私はそれを見ていません...

1
MetalArend

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

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

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

  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...およびtarget authorized_keysパスを使用したターゲット内:

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

    /var/log/installer/syslogで「ディレクトリが見つかりません」エラーを生成します

うまくいけば、これで少しの時間とデバッグが節約できます!

1
D_________

Debian-Installerの代わりにUbiquityを使用できます( https://wiki.ubuntu.com/Installer/FAQ )。したがって、コマンドは次のようになります。

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

正しい場所を指すことにより、「そのようなファイルやディレクトリがない」という問題を解決します:/ target/etc /

1
RAAD

エコーは、ターゲット内ディレクティブ内から機能します。バックティック( `)を付けなければなりません。たとえば、preseedファイルからマシンのホスト名を更新したかったのです。

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

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

0
Todd Sargent

echoin-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を行の前に使用できます
0
Sander