Como obter o endereço IP da máquina em um arquivo de serviço "systemd"

7

Eu preciso pegar o IP da máquina e usá-lo dentro do meu serviço:

[Unit]
Description=Redmine server
After=syslog.target
After=network.target

[Service]
Type=simple
User=redmine
Group=redmine
ip="$(/sbin/ip -o -4 addr list eno16777736 | awk '{print $4}' | cut -d/ -f1)"
ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -b $ip -p 3000

# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=300

[Install]
WantedBy=multi-user.target

Como posso executar esse comando dentro do arquivo de serviço systemd e obter seu resultado:

ip=$(/sbin/ip -o -4 addr list eno16777736 | awk '{print $4}' | cut -d/ -f1)

para usar o resultado em xxx.xxx.xxx.xxx , sth assim:

ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -p 3000 -b $ip
    
por elekgeek 05.09.2015 / 05:09

3 respostas

8

Obtendo o nome do host da máquina com systemd .

Embora eu não esteja profundamente familiarizado com systemd olhando este site tutorial , bem como o official systemd man pages , o que você parece estar procurando é um valor de "especificador":

Many settings resolve specifiers which may be used to write generic unit files referring to runtime or unit parameters that are replaced when the unit files are loaded.

E o especificador específico que acredito funcionaria aqui é %H , que é para "Nome do host" e é descrito como:

The hostname of the running system at the point in time the unit configuration is loaded.

Então, verificando o script systemd do seu exemplo, altere o seu [Service] chunk para isso:

[Service]
Type=simple
User=redmine
Group=redmine
ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -b %H -p 3000

Observe que a linha com a atribuição ip=() desapareceu e o comando ExecStart agora usa %H em vez de $ip .

Uma ideia para obter um endereço IP com systemd .

Dito isso, parece que systemd fornece apenas um nome de host por meio do especificador %H ". O que é estranho se você me perguntar. Então, embora eu não tenha uma experiência profunda com systemd , acredito que entendo o que poderia ser feito para atingir o objetivo deste post.

A chave seria configurar EnvironmentFile para systemd para ler. Leia sobre como usar um EnvironmentFile aqui neste site .

Então, digamos que você criou um script Bash simples como este; Vamos citar write_ip_to_file.sh e sinta-se à vontade para alterar a lógica de busca do endereço IP de ip=$() para corresponder ao que funciona na sua configuração:

#!/bin/bash
ip=$(/sbin/ifconfig eth0 | awk '/inet addr/ {split ($2,A,":"); print A[2]}');
echo IP=$ip > ~/ip.txt;

Tudo o que é necessário é enviar o endereço IP de eth0 para um arquivo de texto chamado ip.txt em seu diretório pessoal. O formato seria algo assim:

IP=123.456.789.0

Entendeu? Boa. Agora, no seu script systemd , altere seu [Service] para ser algo assim; não se esqueça de definir [your username] para corresponder ao nome de usuário do diretório em que ip.txt foi salvo:

[Service]
Type=simple
User=redmine
Group=redmine
EnvironmentFile=/home/[your username]/ip.txt
ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -b $IP -p 3000

E o que isso faria é carregar a configuração em ip.txt e atribuir $IP o valor de 123.456.789.0 . Eu acredito que é isso que você está procurando.

O fator chave aqui é fazer com que write_ip_to_file.sh seja executado na inicialização ou talvez até mesmo pelo próprio script systemd .

Outra ideia para obter um endereço IP com systemd .

Mas com isto dito, eu tenho uma idéia melhor (se funciona): Mova todo o comando ExecStart para o arquivo Bash chamado redmine_start.sh e certifique-se de que o sistema possa lê-lo e executá-lo. O conteúdo de redmine_start.sh seria o seguinte; sinta-se à vontade para alterar a lógica de busca do endereço IP de ip=$() para corresponder ao que funciona na sua configuração:

#!/bin/bash
ip=$(/sbin/ifconfig eth0 | awk '/inet addr/ {split ($2,A,":"); print A[2]}');
/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -b $IP -p 3000

Em seguida, altere seu bloco [Service] para algo assim; não se esqueça de definir [your username] para corresponder ao nome de usuário do diretório em que redmine_start.sh foi salvo:

[Service]
Type=simple
User=redmine
Group=redmine
ExecStart=/home/[your username]/redmine_start.sh

Se você seguir a lógica, se toda a lógica de ExecStart estiver contida em redmine_start.sh , então você pode usar esse truque Bash para obter o endereço IP, atribuí-lo a uma variável e, em seguida, iniciar o Redmine. O script systemd estaria apenas gerenciando quando / como começar isso.

Obtendo o endereço IP da máquina com init.d .

E para a referência de init.d usuários, eu uso o Ubuntu e quando eu preciso pegar um endereço IP atual do sistema de trabalho em um Bash ou um script de inicialização init.d eu executo algo assim:

ip=$(/sbin/ifconfig eth0 | awk '/inet addr/ {split ($2,A,":"); print A[2]}')

É claro que você precisa alterar /sbin/ifconfig para corresponder à localização de ifconfig em seu sistema e também alterar eth0 para corresponder à interface de rede da qual deseja obter o endereço IP.

Mas, uma vez ajustado para corresponder à sua configuração e às necessidades, obtém-se com êxito o endereço IP de uma interface e atribui-o à variável ip , que pode ser acessada como $ip em seu script.

    
por 05.09.2015 / 05:17
5

Use endereços IP do host e EnvironmentFile

Você pode escrever seus endereços IP do host no arquivo /etc/network-environment usando o utilitário setup-network-environment . Então você pode executar seu aplicativo da seguinte maneira:

[Unit]
Requires=setup-network-environment.service
After=setup-network-environment.service

[Service]
EnvironmentFile=/etc/network-environment
ExecStart=/opt/bin/kubelet --hostname_override=${DEFAULT_IPV4}

Fonte: link

    
por 26.08.2016 / 14:33
3

Talvez essa construção funcione. Experimente:

[Service]
Type=simple
User=redmine
Group=redmine
PermissionsStartOnly=true
ExecStartPre=/bin/bash -c "/bin/systemctl set-environment ip=$(/sbin/ip -o -4 addr list eno16777736 | awk '{print $4}' | cut -d/ -f1)"
ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -b ${ip} -p 3000
    
por 18.07.2016 / 19:32