web-dev-qa-db-ja.com

「systemd」サービスファイルでマシンのIPアドレスを取得する方法

マシンのIPを取得して、サービス内で使用する必要があります。

[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

systemd サービスファイル内でこのコマンドを実行して、その結果を取得するにはどうすればよいですか。

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

結果を使用するためにinfor xxx.xxx.xxx.xxx、このようなsth:

ExecStart=/usr/bin/Ruby /home/redmine/redmine/bin/Rails server webrick -e production -p 3000 -b $ip
10
elekgeek

systemdを使用してマシンのホスト名を取得します。

systemd をよく理解していませんが、 このチュートリアルWebサイトofficial systemd manページ 、探しているように見えるのは「指定子」の値です。

多くの設定は、ユニットファイルが読み込まれるときに置き換えられるランタイムまたはユニットパラメータを参照する汎用ユニットファイルを書き込むために使用される指定子を解決します。

そして、ここで機能すると私が確信している特定の指定子は_%H_です。これは「ホスト名」用であり、次のように記述されます。

ユニット構成がロードされた時点での実行中のシステムのホスト名。

例のsystemdスクリプトを確認して、_[Service]_チャンクを次のように変更します。

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

ip=()割り当ての行がなくなり、ExecStartコマンドが_%H_ではなく_$ip_を使用するようになりました。

systemdでIPアドレスを取得するためのアイデア。

そうは言っても、systemdは_%H_「指定子」を介してホスト名を提供するだけのようです。あなたが私に尋ねると、これは奇妙です。ですから、systemdについての深い経験はありませんが、この投稿の目的を達成するために何ができるかを理解していると思います。

重要なのは、EnvironmentFilesystemdを読み取るように設定することです。 an EnvironmentFileの使用方法については、このサイト を参照してください。

たとえば、次のような単純なBashスクリプトを作成したとします。 _write_ip_to_file.sh_という名前にして、ip=$()のIPアドレス取得ロジックを自由に変更して、設定で機能するものと一致させます。

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

行うのは、_eth0_のIPアドレスをホームディレクトリの_ip.txt_という名前のテキストファイルに出力することだけです。形式は次のようになります。

_IP=123.456.789.0
_

わかった?良い。 systemdスクリプトで、_[Service]_チャンクを次のように変更します。 _[your username]_が保存されているディレクトリのユーザー名と一致するように_ip.txt_を設定してください:

_[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
_

そして、それは_ip.txt_に設定をロードし、_$IP_に_123.456.789.0_の値を割り当てます。私はそれがあなたが探しているものだと信じています。

ここでの重要な要素は、_write_ip_to_file.sh_を起動時に、またはsystemdスクリプト自体によっても実行できるようにすることです。

systemdでIPアドレスを取得するための別のアイデア。

しかし、そうは言っても、私は(それが機能する場合)より良いアイデアを持っています:ExecStartコマンド全体を_redmine_start.sh_というBashファイルに移動し、システムがそれを読み取って実行できることを確認します。 _redmine_start.sh_の内容は次のようになります。 ip=$()のIPアドレス取得ロジックを自由に変更して、セットアップで機能するものと一致させてください。

_#!/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
_

次に、_[Service]_チャンクを次のように変更します。 _[your username]_が保存されているディレクトリのユーザー名と一致するように_redmine_start.sh_を設定してください:

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

ロジックに従うと、ExecStartのロジックがすべて_redmine_start.sh_に含まれている場合、そのBashトリックを使用してIPアドレスを取得し、それを変数に割り当てて、そこでRedmineを起動できます。 systemdスクリプトは、いつ/どのように開始するかを管理するだけです。

_init.d_を使用してマシンのIPアドレスを取得します。

また、_init.d_ユーザーのリファレンスとして、Ubuntuを使用しています。Bashまたは_init.d_起動スクリプトで現在動作しているシステムのIPアドレスを取得する必要がある場合は、次のように実行します。

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

もちろん、システム上のifconfigの場所と一致するように_/sbin/ifconfig_を変更し、さらにIPアドレスを取得するネットワークインターフェイスと一致するように_eth0_を変更する必要があります。

ただし、設定とニーズに合わせて調整すると、インターフェイスのIPアドレスを正常に取得して変数ipに割り当て、スクリプトで_$ip_としてアクセスできるようになります。

10
JakeGould

多分この構造はうまくいくでしょう。それを試してみてください:

[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
6
seweryn626

ホストIPアドレスとEnvironmentFileを使用します

setup-network-environment ユーティリティを使用して、ホストIPアドレスを/etc/network-environmentファイルに書き込むことができます。その後、次の方法でアプリを実行できます。

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

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

ソース: https://coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html

6
huevo5050

(最初の)IPアドレスを取得してSystemDの環境に保存するには、hostname -iを使用します。この変数には${Host_IP}でアクセスできます。

ドキュメンテーション:

  • man hostnameパラメータ-iおよび-I
  • man systemctl(設定環境の場合)
  • man systemd.service for ExecStartPre

[Service]
ExecStartPre=/bin/sh -c "systemctl set-environment Host_IP=$(hostname -i)"
0
Raff