Originalmente, eu tinha este script rodando no Ubuntu, 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 reestabelecer esse script para definir os nomes de host do Infiniband para todos os nós.
Idealmente, para economizar a sobrecarga de administração, eu gostaria apenas de plotar um único arquivo de serviço no cloud-init uma vez e iniciá-lo. Então eu vim com 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 de 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, parece que não consigo executar /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)?
O arquivo de serviço e o erro real se seguem.
[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'
Isso 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.