Originalmente, eu tinha esse script rodando no Ubuntu, lançado basicamente em rc.local
#!/bin/bash
IBSYSDIR="/home/matthewh/tmp"
hca_id=1
if [ -d ${IBSYSDIR} ]; then
for hca in ${IBSYSDIR}/*; do
if [ -e ${hca}/node_desc ]; then
echo -n "$(hostname -s) HCA-${hca_id}" >> ${hca}/node_desc
fi
hca_id=$((hca_id+1))
done
fi
Agora minha infraestrutura é CoreOS e gostaria de restabelecer este script para definir os nomes de host Infiniband para todos os nós.
Idealmente, para economizar sobrecarga de administração, gostaria de apenas colocar um único arquivo de serviço no cloud-init uma vez e iniciá-lo. Então eu criei o arquivo de serviço systemd mostrado abaixo. Ao criar a maravilha do arquivo único, consegui encurtar o comando para uma única linha no script do arquivo original.
[ -d ${IBSYSDIR} ] && for hca in ${IBSYSDIR}/*; do [ -e ${hca}/node_desc ] && echo -n "$(hostname -s) HCA-${hca_id}" >> ${hca}/node_desc; done
No entanto, eu não consigo correr/bin/sh -c "[ -d ${IBSYSDIR} ] && for hca in ${IBSYSDIR}/*; do [ -e ${hca}/node_desc ] && echo -n "$(hostname -s) HCA-${hca_id}" >> ${hca}/node_desc; done"
Talvez não esteja puxando o ambiente corretamente para o sh. Como faço para que isso funcione em apenas um único arquivo de serviço (sem outros scripts dependentes)?
Seguem o arquivo de serviço e o erro real.
[Unit]
Description=Set the infiniband hostname
[Service]
Type=oneshot
Environment="IBSYSDIR=/sys/class/infiniband"
Environment="hca_id=1"
ExecStart=/bin/bash -c "[ -d ${IBSYSDIR} ] && for hca in ${IBSYSDIR}/*; do [ -e ${hca}/node_desc ] && echo -n "$(hostname -s) HCA-${hca_id}" >> ${hca}/node_desc; done"
[Install]
WantedBy=multi-user.target
O erro real que estou vendo:
Sep 10 00:30:21 service2-2 systemd[1]: Starting Set the infiniband hostname...
Sep 10 00:30:21 service2-2 sh[11134]: -s): -c: line 0: unexpected EOF while looking for matching `)'
Sep 10 00:30:21 service2-2 sh[11134]: -s): -c: line 1: syntax error: unexpected end of file
Então eu fui um pouco mais longe, mas ainda não funciona.
[Unit]
Description=Set the infiniband hostname
After=docker.service
Requires=docker.service
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'IBSYSDIR=/sys/class/infiniband && hca_id=1 && [ -d ${IBSYSDIR} ] && for hca in ${IBSYSDIR}/*; do [ -e ${hca}/node_desc ] && echo -n "$(hostname -s) HCA-${hca_id}" >> "${hca}/node_desc"; done'
[Install]
WantedBy=multi-user.target
Mas se eu executar diretamente
sudo /bin/bash -c 'IBSYSDIR=/sys/class/infiniband && hca_id=1 && [ -d ${IBSYSDIR} ] && for hca in ${IBSYSDIR}/*; do [ -e ${hca}/node_desc ] && echo -n "$(hostname -s) HCA-${hca_id}" >> "${hca}/node_desc"; done'
Ele funciona. O que há de especial no arquivo de serviço? O código de erro retornado é 1. Presumo que seja um erro de permissão negada ou algo assim.
Altere todos os
$
para$$
.Na documentação do systemd.unit:
Na minha experiência, o systemd não gosta de ter comandos complexos em suas
ExecStart
diretivas.Tente colocar seu script em um arquivo wrapper e executá-lo a partir do arquivo
ExecStart
.