我正在使用带有 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
你有两个选择
变体 1
等待网络和 DNS 准备就绪
但如果网络不可用,也会阻止启动过程!
脚步:
- 激活
systemd
模块(必需)
systemctl enable systemd-networkd-wait-online.service
- 更改你的服务配置
[Unit]
...
After=systemd-networkd-wait-online.service
Requires=systemd-networkd-wait-online.service
变体 2
失败时重新启动脚本并重试
脚步:
- 为服务设置重启配置
[Service]
...
Restart=on-failure
RestartSec=5
- 使用 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