2016-06-29 2 views
0

現在、CoreOSクラスタにELK(Elasticsearch、Logstash、Kibana)スタックを使用してロギングを行っています。私はgelfを使って自動的にログをdockerからlogstashに送ることができます。私は、logstashコンテナのIPアドレスのetcd変数を書くためにサイドキックを使用しています。私はdocker runコマンドのフラグにlogstashのIPを渡す必要があるので、変数が設定されるまで待つ必要があります。ユニット/サービスを開始する前に、etcd変数を待つ方法は設定されています

私の質問は、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 

答えて

1

etcdctl getの代わりにetcdctl watchを使用しましたが、変数がまだ設定されていないかどうかを確認することでした。 だから、フルラインは次のようになります。

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" 
+0

私はもっときれいな解決策のためにもオープンしています。 –

0

あなたの問題は、質問に関するbashプログラミングに沸きますか?

この質問のバリエーションは既にHow to create a loop in bash that is waiting for a webserver to respond?に返信されています。

これは通常1行以上のコードを必要とするので、ロジックをファイルに入れて、1行を使用する代わりにExecStartPreを指す必要があります。

+1

私はすでにExecStartPreでそのようなものを持っていたが、何も変わっていません。それはwhileループです:$ {ADDR} == ""または$ {ADDR}が空のときは他の値になります –

関連する問題