在 systemd 中 curl 依赖项时无法解析主机

在 systemd 中 curl 依赖项时无法解析主机

我正在使用带有 cloud-init 的 CoreOS,并尝试为 flannel 执行 curl。我有一个这样的单元文件:

[Unit]
Description=Run flannel
Documentation=https://github.com/coreos/flannel
Requires=etcd2.service
After=etcd2.service
[Service]
ExecStartPre=/usr/bin/curl -L -o /opt/bin/flannel-0.5.1-linux-amd64.tar.gz -z /opt/bin/flannel-0.5.1-linux-amd64.tar.gz https://github.com/coreos/flannel/releases/download/v0.5.1/flannel-0.5.1-linux-amd64.tar.gz
ExecStartPre=/usr/bin/tar -C /opt/bin -xzvf /opt/bin/flannel-0.5.1-linux-amd64.tar.gz
ExecStartPre=/usr/bin/mv /opt/bin/flannel-0.5.1/flanneld /opt/bin/flanneld
ExecStartPre=/usr/bin/rm -rf /opt/bin/flannel-0.5.1
ExecStartPre=/usr/bin/rm -rf /opt/bin/flannel-0.5.1-linux-amd64.tar.gz
ExecStart=/opt/bin/flanneld

当它转到 flannel 的 curl 时,我得到cannot resolve host 'github.com'并且 curl 退出时代码为 1。是否存在一些问题导致我在 systemd 启动时无法使用 dns?

答案1

对于 CoreOS,你将需要:

[Unit]
Requires=network-online.target

有一个network.target和之间的区别network-online.target.network-online.target是在 中尝试执行网络挂载时拉入的内容/etc/fstab,并且您的依赖项需求更接近于此。使用它。

答案2

就我而言,这个答案有效https://unix.stackexchange.com/questions/353179/why-isnt-my-systemd-service-waiting-for-the-network/356189#356189

你有两个选择

变体 1

等待网络和 DNS 准备就绪

但如果网络不可用,也会阻止启动过程!

脚步:

  1. 激活systemd模块(必需)
systemctl enable systemd-networkd-wait-online.service
  1. 更改你的服务配置
[Unit]
...
After=systemd-networkd-wait-online.service
Requires=systemd-networkd-wait-online.service

变体 2

失败时重新启动脚本并重试

脚步:

  1. 为服务设置重启配置
[Service]
...
Restart=on-failure
RestartSec=5
  1. 使用 curl 的示例 bash 脚本
#!/bin/sh
STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}"  https://webhook.example)

if test $STATUSCODE -ne 200; then
    exit 1
fi

exit 0

相关内容