J'essaie d'exécuter le fichier de préconfiguration suivant sur une machine serveur Ubuntu 16.04 (lors de la création d'un programme de compression):
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;
Dans/var/log/installer/syslog, je peux voir l'erreur suivante:
log-output: sh:
log-output: tee: not found
Quand je change la partie "| tee -a" en ">>" comme ceci:
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;
Il commence soudain à se plaindre de ne pas pouvoir trouver le répertoire, sans rien dire à propos de la ligne mkdir - il ne crée donc pas le répertoire, ni ne le trouve pas:
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
J'ai étudié d'autres scripts sur github. De plus, j'ai ajouté la ligne suivante au fichier preseed.cfg:
d-i pkgsel/include string openssh-server coreutils wget Sudo
J'ai même essayé d'installer coreutils en tant que commande in-target, pour être sûr que tee devrait être disponible. Cela fait quelques jours que je suis sur cette question, reconstruisant maintes et maintes fois pour trouver les mêmes erreurs dans le syslog. Si quelqu'un peut nous éclairer un peu, il faut que ce soit simple, mais je ne le vois pas ...
Si vous préférez utiliser le programme d’installation Debian, cela m’a fonctionné sur le serveur 17.10.1 lors de l’ajout d’une clé publique ssh à allowed_keys. Vous devez vous assurer que le répertoire .ssh est créé à l'avance.
d-i preseed/late_command string in-target /bin/sh -c 'echo "my string" >> /home/username/.ssh/authorized_keys';
J'ai passé environ une journée à déboguer ceci et à essayer ce qui suit avec différents résultats. Ce serait bien s'il y avait une documentation plus détaillée sur laquelle Shell est utilisé dans l'installateur Debian pour les diverses directives non/'in-target', mais je ne cherche probablement pas au bon endroit.
écho simple dans la cible avec le chemin simple plié de CCC:
in-target echo "my string" >> /home/username/.ssh/authorized_keys;
donne "répertoire introuvable" dans /var/log/installer/syslog
echo non conforme à la cible avec le chemin cible allowed_keys:
in-target echo "my string" >> /target/home/username/.ssh/authorized_keys;
produit un fichier allowed_keys vierge sur la machine cible et lorsque vous visualisez /var/log/installer/syslog
, vous trouvez que "ma chaîne" est exporté vers stdout
in-target avec le chemin explicite sh -c...
et la cible de allowed_keys:
in-target /bin/sh -c 'echo "my string" >> /target/home/username/.ssh/authorized_keys';
produit une erreur "répertoire introuvable" dans /var/log/installer/syslog
Espérons que cela économise un peu de temps et de débogage!
Vous pouvez utiliser Ubiquity au lieu de Debian-Installer ( https://wiki.ubuntu.com/Installer/FAQ ), afin que votre commande soit:
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
Il résout le "fichier ou répertoire de ce type" signalé en pointant au bon endroit:/target/etc /
echo fonctionnera à partir d'une directive in-target. Vous devez le mettre avec des ticks arrière (`). Par exemple, je voulais mettre à jour le nom d'hôte de ma machine à partir du fichier de préconfiguration:
nom d'hôte in-target echo "ubn"$(lshw | grep -m 1 serial | awk '{print tolower ($2)}')
Les ticks arrière indiquent au Shell de l'exécuter en une seule commande.
Cela ne semble pas fonctionner d'utiliser echo
dans in-target
. Pour résoudre ce problème, essayez ce qui suit (essayé dans Ubuntu 18.04):
d-i preseed/late_command string \
echo "some text" >> /target/path/to/file.ext ; \
in-target [some-other-command-in-target]
REMARQUE:
in-target
avant la ligne/target
avant le chemin réelin-target
avant la ligne.