マシンの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
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
についての深い経験はありませんが、この投稿の目的を達成するために何ができるかを理解していると思います。
重要なのは、EnvironmentFile
がsystemd
を読み取るように設定することです。 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
_としてアクセスできるようになります。
多分この構造はうまくいくでしょう。それを試してみてください:
[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
ホスト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
(最初の)IPアドレスを取得してSystemDの環境に保存するには、hostname -i
を使用します。この変数には${Host_IP}
でアクセスできます。
ドキュメンテーション:
man hostname
パラメータ-iおよび-Iman systemctl
(設定環境の場合)man systemd.service
for ExecStartPre例
[Service]
ExecStartPre=/bin/sh -c "systemctl set-environment Host_IP=$(hostname -i)"