
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:
Ao fazer
in-target some_command > /some/path
o redirecionamento NÃO ocorrerá dentro do alvo. Você precisaria fazer:in-target --pass-stdout some_command > /target/some/path
O
in-target
comando redirecionará a saída do comando para o arquivo de log. Portanto, tentar redirecionar a saída dein-target
não funciona por padrão. O que você precisa fazer é usar o--pass-stdout
argumento 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'
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 echo
em 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-target
antes da linha - Use
/target
antes do caminho real - Em outros comandos você pode usar principalmente
in-target
antes 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.
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
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/syslog
você descobre que "minha string" é enviada parastdout
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.