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を再構築します。誰かがこれに光を当てることができれば-それは単純なものでなければなりませんが、私はそれを見ていません...
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インストーラーで使用されている詳細なドキュメントがあればいいのですが、私はおそらく正しい場所を探していません。
プレーンなauthorized_keysパスを持つプレーンなターゲット内エコー:
in-target echo "my string" >> /home/username/.ssh/authorized_keys;
/var/log/installer/syslog
に「ディレクトリが見つかりません」を与える
ターゲットauthorized_keysパスを使用したプレーンターゲット内エコー:
in-target echo "my string" >> /target/home/username/.ssh/authorized_keys;
ターゲットマシン上で空白のauthorized_keysファイルを生成し、/var/log/installer/syslog
を表示すると、 "my string"がstdout
に出力されます
明示的なsh -c...
およびtarget authorized_keysパスを使用したターゲット内:
in-target /bin/sh -c 'echo "my string" >> /target/home/username/.ssh/authorized_keys';
/var/log/installer/syslog
で「ディレクトリが見つかりません」エラーを生成します
うまくいけば、これで少しの時間とデバッグが節約できます!
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 /
エコーは、ターゲット内ディレクティブ内から機能します。バックティック( `)を付けなければなりません。たとえば、preseedファイルからマシンのホスト名を更新したかったのです。
ターゲット内のホスト名echo "ubn"$(lshw | grep -m 1 serial | awk '{print tolower ($2)}')
バックチェックは、これを1つのコマンドとして実行するようシェルに指示します。
echo
を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
を行の前に使用できます