Encontrei este arquivo de serviço systemd para iniciar o autossh para manter um túnel ssh: https://gist.github.com/thomasfr/9707568
[Unit]
Description=Keeps a tunnel to 'remote.example.com' open
After=network.target
[Service]
User=autossh
# -p [PORT]
# -l [user]
# -M 0 --> no monitoring
# -N Just open the connection and do nothing (not interactive)
# LOCALPORT:IP_ON_EXAMPLE_COM:PORT_ON_EXAMPLE_COM
ExecStart=/usr/bin/autossh -M 0 -N -q -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -p 22 -l autossh remote.example.com -L 7474:127.0.0.1:7474 -i /home/autossh/.ssh/id_rsa
[Install]
WantedBy=multi-user.target
Existe uma maneira de configurar o systemd para iniciar vários túneis em um serviço.
Não quero criar arquivos de serviço do sistema N, pois quero evitar copiar e colar.
Todos os arquivos de serviço seriam idênticos, exceto "remote.example.com" que seria substituído por outros nomes de host.
1,5 ano depois...
Fiz essa pergunta há cerca de 1,5 ano.
Minha mente mudou. Sim, é bom que você possa fazer isso com o systemd, mas usarei o gerenciamento de configuração no futuro.
Por que o systemd deveria implementar uma linguagem de modelo e substituir %h? .. Acho que não faz sentido.
Vários meses depois, acho que esse loop e modelo devem ser resolvidos em um nível diferente. Eu usaria Ansible ou TerraForm para isso agora.
Bem, assumindo que a única coisa que muda por arquivo de unidade é a
remote.example.com
parte, você pode usar um serviço instanciado .Na
systemd.unit
página de manual:Basicamente, você cria um único arquivo de unidade, que contém uma variável (geralmente
%i
) onde ocorrem as diferenças e, em seguida, elas são vinculadas quando você "habilita" esse serviço.Por exemplo, tenho um arquivo de unidade chamado
/etc/systemd/system/[email protected]
que se parece com isto:Que eu então habilitei
E pode interagir com
Como você pode ver, todas as instâncias de
%i
no arquivo de unidade são substituídas porsomehost.example.com
.Há muito mais especificadores que você pode usar em um arquivo de unidade, mas acho
%i
que funcionam melhor em casos como este.Aqui está um exemplo de python, que era o que eu estava procurando. O
@
no nome do arquivo de serviço permite iniciar N processos:Vários métodos para chamá-lo
Ativando várias contagens, por exemplo:
Habilite 30 trabalhadores:
Habilitar 2 trabalhadores:
Em seguida, certifique-se de recarregar:
Agora você pode iniciar/parar de várias maneiras:
Início 1:
Iniciar Múltiplo:
Parada Múltipla:
Verifique o estado:
ATUALIZAÇÃO : Para gerenciar instâncias como um serviço, você pode fazer algo assim:
/etc/systemd/system/[email protected]:
/usr/bin/some-worker-start.sh:
/etc/systemd/system/some-worker.service:
E agora você pode gerenciar todas as instâncias com
sudo systemctl some-worker (start|restart|stop)
Aqui está um clichê para o seu
script.py
:A resposta de GregL me ajudou muito. Aqui está um exemplo de um modelo de unidade que usei em meu código usando o exemplo acima para um servidor de trabalho gearman. Eu fiz um script de shell que me permite criar uma quantidade X de "trabalhadores" usando este modelo.
Procurei uma solução para uma tarefa semelhante e, na verdade, encontrei uma, que acredito ser mais fácil de realizar, mas supostamente é hacky . (e não é mencionado aqui)
Serviço /etc/systemd/system/ssh_tunnel.service:
/etc/openvpn/ssh_tunnels.sh:
Resultado:
No entanto, ainda não verifiquei como ele sobrevive à reinicialização da VPN, mas é outro tópico.