
Ich versuche, die folgende Preseed-Datei auf einem Ubuntu 16.04-Servercomputer auszuführen (während eines Packer-Builds):
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;
In /var/log/installer/syslog wird mir der folgende Fehler angezeigt:
log-output: sh:
log-output: tee: not found
Wenn ich den Teil „| tee -a“ in ">>" ändere, wie folgt:
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;
Plötzlich beginnt es sich zu beschweren, dass es das Verzeichnis nicht finden kann, ohne etwas über die Zeile mkdir zu sagen – es erstellt also weder das Verzeichnis noch findet es es nicht:
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
Ich habe mir andere Skripte auf GitHub angesehen. Außerdem habe ich der Datei preseed.cfg die folgende Zeile hinzugefügt:
d-i pkgsel/include string openssh-server coreutils wget sudo
Ich habe sogar versucht, Coreutils als In-Target-Befehl zu installieren, um sicherzustellen, dass Tee verfügbar sein sollte. Ich bin jetzt seit ein paar Tagen dabei, baue Ubuntu immer wieder neu auf, nur um die gleichen Fehler im Syslog zu finden. Wenn jemand Licht in die Sache bringen könnte – es muss etwas Einfaches sein, aber ich sehe es nicht …
Antwort1
Zwei Dinge:
Dabei
in-target some_command > /some/path
erfolgt die Umleitung NICHT innerhalb des Ziels. Sie müssen Folgendes tun:in-target --pass-stdout some_command > /target/some/path
Der
in-target
Befehl leitet die Ausgabe des Befehls in die Protokolldatei um. Der Versuch, die Ausgabe umzuleiten,in-target
funktioniert daher standardmäßig nicht. Sie müssen das--pass-stdout
Argument in-target verwenden.
in-target --pass-stdout echo "hello" > /target/root/hello.txt
Dadurch wird eine Datei /target/root/hello.txt mit dem Inhalt „Hallo“ erstellt.
in-target: Führt den angegebenen Befehl in /target aus und gibt seinen Beendigungsstatus zurück. Das Debconf-Passthrough-Frontend wird verwendet, um Debconf-Fragen mit cdebconf im Installationsprogramm zu stellen. Dies ist besonders nützlich, um Dinge wie dpkg-reconfigure, debconf-apt-progress und tasksel auszuführen. Das Dienstprogramm log-output wird verwendet, um alle Ausgaben zu protokollieren; wenn in-target mit der Option --pass-stdout aufgerufen wird, wird log-output dies berücksichtigen.
Antwort2
echo
Die Verwendung von into scheint nicht zu funktionieren in-target
. Um dieses Problem zu lösen, versuchen Sie Folgendes (ausprobiert in Ubuntu 18.04):
d-i preseed/late_command string \
echo "some text" >> /target/path/to/file.ext ; \
in-target [some-other-command-in-target]
NOTIZ:
- Nicht
in-target
vor der Zeile verwenden /target
Vor dem tatsächlichen Pfad verwenden- In anderen Befehlen können Sie meistens
in-target
vor der Zeile verwenden
Antwort3
Wenn Sie lieber das Debian-Installationsprogramm verwenden möchten, hat dies bei mir auf dem Server 17.10.1 funktioniert, als ich einen öffentlichen SSH-Schlüssel zu authorized_keys hinzugefügt habe. Sie müssen sicherstellen, dass das .ssh-Verzeichnis vorher erstellt wird.
d-i preseed/late_command string in-target /bin/sh -c 'echo "my string" >> /home/username/.ssh/authorized_keys';
Ich habe etwa einen Tag damit verbracht, dies zu debuggen, und Folgendes mit unterschiedlichen Ergebnissen versucht. Es wäre schön, wenn es eine detailliertere Dokumentation darüber gäbe, welche Shell im Debian-Installer für die verschiedenen Nicht-/„In-Target“-Direktiven verwendet wird, aber ich suche wahrscheinlich nicht an der richtigen Stelle.
einfaches In-Target-Echo mit einfachem authorized_keys-Pfad:
in-target echo "my string" >> /home/username/.ssh/authorized_keys;
gibt "Verzeichnis nicht gefunden" in
/var/log/installer/syslog
einfaches In-Target-Echo mit Zielpfad „authorized_keys“:
in-target echo "my string" >> /target/home/username/.ssh/authorized_keys;
erzeugt eine leere authorized_keys Datei auf dem Zielrechner und beim Betrachten
/var/log/installer/syslog
finden Sie "my string" wird ausgegeben anstdout
im Ziel mit explizitem
sh -c...
und Zielpfad für autorisierte Schlüssel:in-target /bin/sh -c 'echo "my string" >> /target/home/username/.ssh/authorized_keys';
erzeugt einen "Verzeichnis nicht gefunden"-Fehler in
/var/log/installer/syslog
Hoffentlich spart dies etwas Zeit und Fehlerbehebung!
Antwort4
echo funktioniert innerhalb einer in-target-Direktive. Sie müssen es mit Backticks (`) versehen. Ich wollte beispielsweise den Hostnamen meiner Maschine aus der Preseed-Datei aktualisieren:
In-Ziel-Hostnameecho "ubn"$(lshw | grep -m 1 serial | awk '{print tolower ($2)}')
Backticks weisen die Shell an, dies als einen Befehl auszuführen.