web-dev-qa-db-fra.com

Débogage preseed / late_command pour le serveur Ubuntu 16.04: tee introuvable ou répertoire non existant

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 ...

1
MetalArend

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.

  1. é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

  2. 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

  3. 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!

1
D_________

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 /

1
RAAD

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.

0
Todd Sargent

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:

  • N'utilisez pas in-target avant la ligne
  • Utilisez /target avant le chemin réel
  • Dans d’autres commandes, vous pouvez principalement utiliser in-target avant la ligne.
0
Sander