"systemd"서비스 파일에서 시스템 IP 주소를 얻는 방법


7

나는 기계의 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)

결과 정보를 사용하려면 xxx.xxx.xxx.xxx, 이렇게 sth :

ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -p 3000 -b $ip

답변:


8

기계 호스트 이름 가져 오기 systemd.

내가 깊이 익숙하지는 않지만 systemd 들여다 보며 이 자습서 웹 사이트 뿐만 아니라 공무원 systemd 매뉴얼 페이지 , 당신이 찾고있는 것 "specifier"값입니다 :

많은 설정이 제네릭을 작성하는 데 사용될 수있는 지정자를 해결합니다.   대체되는 런타임 또는 유닛 매개 변수를 참조하는 유닛 파일   단위 파일이로드 될 때.

그리고 내가 여기에서 일할 것이라고 확신하는 특정 지정자는 %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.

IP 주소를 얻기위한 아이디어 systemd.

즉, systemd 를 통해 호스트 이름 만 제공합니다. %H "지정자."당신이 나에게 묻는다면 이상하게 보입니다. 그래서 나는 깊은 경험이 없다. systemd, 나는이 포스트의 목표를 달성하기 위해 할 수있는 일을 이해한다고 믿는다.

열쇠는 EnvironmentFile ...에 대한 systemd 읽다. 사용법을 읽어보십시오. ~ 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;

IP 주소를 출력하면됩니다. eth0 이름이 지정된 텍스트 파일로 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

그리고 그것은 config를로드하는 것입니다. ip.txt 할당하다 $IP 의 가치 123.456.789.0. 나는 그것이 당신이 찾고있는 것이라고 믿습니다.

여기에 핵심 요소는 write_ip_to_file.sh 부팅시 또는 심지어는 systemd 스크립트 자체.

IP 주소를 얻기위한 또 다른 아이디어 systemd.

그러나 그 말로는, 나는 더 좋은 생각을 가지고있다. ExecStart 명령을 Bash 파일에 호출 redmine_start.sh 시스템이이를 읽고 실행할 수 있는지 확인하십시오. 내용 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 스크립트는 언제 / 어떻게 시작 할지를 관리 할 것입니다.

머신 IP 주소 받기 init.d.

그리고의 참조 용 init.d 사용자, 나는 Ubuntu를 사용하며 Bash 또는 Windows에서 현재 작업중인 시스템 IP 주소를 가져와야 할 때 init.d 시작 스크립트 나는 다음과 같이 실행한다.

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

물론 변경해야합니다. /sbin/ifconfig 위치와 일치하는 ifconfig 귀하의 시스템에, 그리고 또한 변경 eth0 IP 주소를 얻으려는 네트워크 인터페이스와 일치시킵니다.

그러나 일단 설정과 필요에 맞게 조정되면 인터페이스의 IP 주소를 성공적으로 가져 와서 변수에 할당합니다. ip 그러면 다음과 같이 액세스 할 수 있습니다. $ip 스크립트에서


1
이것은 일반적인 스크립트입니다. 하지만 내 질문은 인터페이스의 현재 IP 주소를 제공하기 위해 sth.service 파일에서이 작업을 수행하는 방법이었습니다.
elekgeek

@elekgeek 몇 가지 동일한 정확한 형식을 사용합니다. init.d 내가 만든 스크립트와 구문 / 형식이 잘 작동하는 시작 서비스 스크립트.
JakeGould

1
하지만 이것은 작동하지 않습니다, 첫 번째 게시물에서 서비스 코드를 보면,이 작동하지 않습니다 ..
elekgeek

1
btw, 이것은 서비스이고 상태를 볼 때 $ ip가 결과를 반환하지 않는다는 것을 보여줍니다. 따라서 ip가 비어 있고 서비스가 시작되지 않습니다.
elekgeek

@elekgeek 내 최신 편집을 확인하십시오. 나는 파기를하고 어떻게 정보를 찾았 는가? systemd 변수를 처리합니다. 그들은 그들을 "지정자"라고 부른다.
JakeGould

5

호스트 IP 주소 및 EnvironmentFile

호스트 IP 주소를 다음에 기록 할 수 있습니다. /etc/network-environment 사용하는 파일 setup-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


4

어쩌면이 건축은 작동 할 것입니다. 시도 해봐:

[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

함께 작업 확인 systemd 228
mleu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.