如何将 curl 的结果分配给 systemd 变量?

mat*_*ttm 1 curl amazon-web-services systemd

我使用的是亚马逊网络服务的服务器,并正在试图建立一个systemd作业需要作为输入AWS外部IP检索的curl

[Unit]
Description=My example with AWS external IP
Wants=network-online.target
After=network-online.target

[Service]
Type=forking
Environment=EXTERNAL_IP=$(/usr/bin/curl http://169.254.169.254/latest/meta-data/public-ipv4)
ExecStart=/path/to/myexample $EXTERNAL_IP

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

验证工具systemd-analyze verify myexample.service表明curl环境分配存在问题。

Invalid environment assignment, ignoring: EXTERNAL_IP=$(/usr/bin/curl http://169.254.169.254/latest/meta-data/public-ipv4)

如果我用curl硬编码的 IP 字符串替换结果,我的守护进程就会启动。如何curl在我的 systemd 作业中使用结果?

Mic*_*ton 6

(首先,我假设您使用的是coturn或其前身之一。)

首先,systemd 单元不是 shell 脚本,也不会被 shell 解析。这就是为什么您不能只调用命令并将其输出用作环境变量的原因。

但是,可以调用 shellExecStart=,这可能是启动和运行的最快方式。

Type=simple
ExecStart=/bin/bash -c '/usr/local/bin/turnserver -X $(/usr/bin/curl http://169.254.169.254/latest/meta-data/public-ipv4)'
Run Code Online (Sandbox Code Playgroud)

(在此配置,你应该带守护进程turnserver -o。)

您还可以编写一个脚本,您可以从中调用该脚本,该脚本ExecStartPre=获取您的元数据,然后更改 turnserver.conf,这将在守护程序启动之前发生。