在启动单元/服务之前,如何设置等待etd变量

时间:2016-06-29 15:06:23

标签: docker systemd coreos

我目前正在使用CoreOS集群中的ELK(Elasticsearch,Logstash,Kibana)堆栈进行日志记录。我发现,你可以使用gelf自动将日志从docker发送到logstash。我正在使用sidekick来编写logstash容器IP地址的etcd变量。由于我必须将logstash的IP传递给docker run命令中的标志,因此我需要等到变量设置完毕。

我的问题是如何等到etcdctl get /network/logstash返回IP地址。

这就是我的单位文件当前的样子:

[Unit]
Description=nginx with elk logging
After=logstash-discovery.service
Requires=docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=/usr/bin/bash -c "/usr/bin/systemctl set-environment ADDR=$(etcdctl get /network/logstash)"
ExecStartPre=-/usr/bin/docker kill nginx1
ExecStartPre=-/usr/bin/docker rm nginx1
ExecStartPre=/usr/bin/docker pull 10.0.2.2:5000/nginx
ExecStart=/usr/bin/docker run -p 80:80 --name=nginx1 --net=host --log-driver=gelf --log-opt gelf-address=udp://${ADDR}:12201 --log-opt gelf-tag="fe" 10.0.2.2:5000/nginx
ExecStop=/usr/bin/docker stop nginx1

[X-Fleet]
Conflicts=logstash.service

2 个答案:

答案 0 :(得分:1)

解决方案是使用etcdctl watch代替etcdctl get,但请检查变量是否已设置。 所以整行看起来像这样:

ExecStartPre=/usr/bin/bash -c \
"if [ -z $(etcdctl get /network/logstash) ]; \
then /usr/bin/systemctl set-environment ADDR=$(etcdctl watch /network/logstash); \
else /usr/bin/systemctl set-environment ADDR=$(etcdctl get /network/logstash); \
fi"

答案 1 :(得分:0)

您的问题归结为关于bash编程的问题:在继续之前,您如何等待变量设置?

How to create a loop in bash that is waiting for a webserver to respond?已经回答了该问题的一个变体。

这通常需要多行代码,因此您可能需要将逻辑放在一个文件中并将ExecStartPre指向该文件,而不是使用单行代码。