Depurando preseed/late_command para servidor Ubuntu 16.04: tee não encontrado vs diretório inexistente

Depurando preseed/late_command para servidor Ubuntu 16.04: tee não encontrado vs diretório inexistente

Estou tentando executar o seguinte arquivo de pré-configuração em uma máquina servidor Ubuntu 16.04 (durante uma compilação do packer):

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;

Em /var/log/installer/syslog posso ver o seguinte erro:

log-output: sh:
log-output: tee: not found

Quando eu mudo a parte "| tee -a" para ">>" assim:

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;

De repente, ele começa a reclamar que não consegue encontrar o diretório, sem dizer nada sobre a linha mkdir - portanto, não está criando o diretório nem não o encontrando:

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

Tenho procurado outros scripts no github. Também adicionei a seguinte linha ao arquivo preseed.cfg:

d-i pkgsel/include string openssh-server coreutils wget sudo

Eu até tentei instalar coreutils como comando in-target, para ter certeza de que tee deveria estar disponível. Estou nisso há alguns dias, reconstruindo o Ubuntu repetidas vezes, apenas para encontrar os mesmos erros no syslog. Se alguém pudesse esclarecer isso - deve ser algo simples, mas não estou vendo ...

Responder1

Duas coisas:

  1. Ao fazer in-target some_command > /some/patho redirecionamento NÃO ocorrerá dentro do alvo. Você precisaria fazer:in-target --pass-stdout some_command > /target/some/path

  2. O in-targetcomando redirecionará a saída do comando para o arquivo de log. Portanto, tentar redirecionar a saída de in-targetnão funciona por padrão. O que você precisa fazer é usar o --pass-stdoutargumento para atingir o alvo

in-target --pass-stdout echo "hello" > /target/root/hello.txt

Isso criará um arquivo /target/root/hello.txt com o conteúdo 'hello'

De:https://salsa.debian.org/installer-team/debian-installer-utils/-/blob/3e67bc7987eb4a9cdff5fe8d1084e612fe7bb48f/README

in-target: executa o comando especificado em /target e retorna seu status de saída. O frontend de passagem do debconf é usado para fazer perguntas sobre o debconf usando cdebconf no instalador. Isto é especialmente útil para executar coisas como dpkg-reconfigure, debconf-apt-progress e tasksel. O utilitário log-output é usado para registrar qualquer saída; se in-target for chamado com a opção --pass-stdout, log-output irá respeitá-lo.

Responder2

Não parece funcionar para usar echoem in-target. Para resolver isso, tente o seguinte (tentado no Ubuntu 18.04):

d-i preseed/late_command string \
    echo "some text" >> /target/path/to/file.ext ; \
    in-target [some-other-command-in-target]

OBSERVAÇÃO:

  • Não use in-targetantes da linha
  • Use /targetantes do caminho real
  • Em outros comandos você pode usar principalmente in-targetantes da linha

Responder3

Se você preferir usar o instalador debian, isso funcionou para mim no servidor 17.10.1 ao adicionar uma chave pública ssh aauthorized_keys. Você deve certificar-se de que o diretório .ssh foi criado antecipadamente.

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

Passei cerca de um dia depurando isso e tentei o seguinte com vários resultados. Seria bom se houvesse documentação mais detalhada sobre qual shell é usado no instalador debian para as várias diretivas não / 'no destino', mas provavelmente não estou procurando no lugar certo.

  1. eco simples no destino com caminho autorizado_keys simples:

    in-target echo "my string" >> /home/username/.ssh/authorized_keys;
    

    dá "diretório não encontrado" em/var/log/installer/syslog

  2. eco simples no destino com caminho de chaves_autorizadas de destino:

    in-target echo "my string" >> /target/home/username/.ssh/authorized_keys;
    

    produz um arquivo autorizado_keys em branco na máquina de destino e, ao visualizar, /var/log/installer/syslogvocê descobre que "minha string" é enviada parastdout

  3. in-target com sh -c...caminho explícito e de target_keys:

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

    produz um erro "diretório não encontrado" em/var/log/installer/syslog

Esperamos que isso economize um pouco de tempo e depuração!

Responder4

echo funcionará dentro de uma diretiva no alvo. Você tem que colocá-lo com crases (`). Por exemplo, eu queria atualizar o nome do host da minha máquina a partir do arquivo de pré-configuração:

nome de host no destinoecho "ubn"$(lshw | grep -m 1 serial | awk '{print tolower ($2)}')

Back-ticks informa ao shell para executar isso como um comando.

informação relacionada