システムロガーとしてのdockerのSplunk Universal Forwarder





Splunkは、ログを収集および分析するための最も有名な商用製品の1つです。 今でも、ロシアでの販売が終了した時点で、この製品に指示/ハウツーを書かない理由はありません。



タスク :ホスト構成を変更せずにSplunkのdockerノードからシステムログを収集する



公式のアプローチから始めたいと思いますが、これはdockerを使用すると奇妙に見えます。

Dockerハブへのリンク

私たちは何を持っています:



1. Pullimイメージ



$ docker pull splunk/universalforwarder:latest
      
      





2.必要なパラメーターでコンテナを起動します



 $ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=<password>' splunk/universalforwarder:latest
      
      





3.コンテナに入ります



 docker exec -it <container-id> /bin/bash
      
      





次に、ドキュメントの既知のアドレスに移動するように求められます。



そして、起動後にコンテナを構成します。



 ./splunk add forward-server <host name or ip address>:<listening port> ./splunk add monitor /var/log ./splunk restart
      
      





ちょっと待って なに?



しかし、驚きはこれで終わりではありません。 インタラクティブモードで公式イメージからコンテナを実行すると、次のように表示されます。



少しがっかり
 $ docker run -it -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=password' splunk/universalforwarder:latest PLAY [Run default Splunk provisioning] ******************************************************************************************************************************************************************************************************* Tuesday 09 April 2019 13:40:38 +0000 (0:00:00.096) 0:00:00.096 ********* TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************** ok: [localhost] Tuesday 09 April 2019 13:40:39 +0000 (0:00:01.520) 0:00:01.616 ********* TASK [Get actual hostname] ******************************************************************************************************************************************************************************************************************* changed: [localhost] Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.599) 0:00:02.215 ********* Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.054) 0:00:02.270 ********* TASK [set_fact] ****************************************************************************************************************************************************************************************************************************** ok: [localhost] Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.075) 0:00:02.346 ********* Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.067) 0:00:02.413 ********* Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.060) 0:00:02.473 ********* Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.051) 0:00:02.525 ********* Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.056) 0:00:02.582 ********* Tuesday 09 April 2019 13:40:41 +0000 (0:00:00.216) 0:00:02.798 ********* included: /opt/ansible/roles/splunk_common/tasks/change_splunk_directory_owner.yml for localhost Tuesday 09 April 2019 13:40:41 +0000 (0:00:00.087) 0:00:02.886 ********* TASK [splunk_common : Update Splunk directory owner] ***************************************************************************************************************************************************************************************** ok: [localhost] Tuesday 09 April 2019 13:40:41 +0000 (0:00:00.324) 0:00:03.210 ********* included: /opt/ansible/roles/splunk_common/tasks/get_facts.yml for localhost Tuesday 09 April 2019 13:40:41 +0000 (0:00:00.094) 0:00:03.305 *********    ...
      
      





素晴らしい。 画像にはアーチファクトさえありません。 つまり、起動するたびに、バイナリを含むアーカイブをダウンロードし、解凍して構成するのに時間がかかります。

しかし、ドッカーウェイなどはどうでしょうか?



結構です 私たちは他の方法で行きます。 これらすべての操作をアセンブリ段階で実行するとどうなりますか? それでは行こう!



長時間引っ張らないように、すぐに最終画像を表示します。



Dockerfile
 #      FROM centos:7 #  ,         ENV SPLUNK_HOME /splunkforwarder ENV SPLUNK_ROLE splunk_heavy_forwarder ENV SPLUNK_PASSWORD changeme ENV SPLUNK_START_ARGS --accept-license #   # wget -    # expect -     Splunk    # jq -   ,     RUN yum install -y epel-release \ && yum install -y wget expect jq # , ,  RUN wget -O splunkforwarder-7.2.4-8a94541dcfac-Linux-x86_64.tgz 'https://www.splunk.com/bin/splunk/DownloadActivityServlet?architecture=x86_64&platform=linux&version=7.2.4&product=universalforwarder&filename=splunkforwarder-7.2.4-8a94541dcfac-Linux-x86_64.tgz&wget=true' \ && wget -O docker-18.09.3.tgz 'https://download.docker.com/linux/static/stable/x86_64/docker-18.09.3.tgz' \ && tar -xvf splunkforwarder-7.2.4-8a94541dcfac-Linux-x86_64.tgz \ && tar -xvf docker-18.09.3.tgz \ && rm -f splunkforwarder-7.2.4-8a94541dcfac-Linux-x86_64.tgz \ && rm -f docker-18.09.3.tgz #  shell   ,   inputs.conf, splunkclouduf.spl  first_start.sh   .     source . COPY [ "inputs.conf", "docker-stats/props.conf", "/splunkforwarder/etc/system/local/" ] COPY [ "docker-stats/docker_events.sh", "docker-stats/docker_inspect.sh", "docker-stats/docker_stats.sh", "docker-stats/docker_top.sh", "/splunkforwarder/bin/scripts/" ] COPY splunkclouduf.spl /splunkclouduf.spl COPY first_start.sh /splunkforwarder/bin/ #    ,       RUN chmod +x /splunkforwarder/bin/scripts/*.sh \ && groupadd -r splunk \ && useradd -r -m -g splunk splunk \ && echo "%sudo ALL=NOPASSWD:ALL" >> /etc/sudoers \ && chown -R splunk:splunk $SPLUNK_HOME \ && /splunkforwarder/bin/first_start.sh \ && /splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme \ && /splunkforwarder/bin/splunk restart #    COPY [ "init/entrypoint.sh", "init/checkstate.sh", "/sbin/" ] #  .     /,  . VOLUME [ "/splunkforwarder/etc", "/splunkforwarder/var" ] HEALTHCHECK --interval=30s --timeout=30s --start-period=3m --retries=5 CMD /sbin/checkstate.sh || exit 1 ENTRYPOINT [ "/sbin/entrypoint.sh" ] CMD [ "start-service" ]
      
      





そして、に含まれるもの



first_start.sh
 #!/usr/bin/expect -f set timeout -1 spawn /splunkforwarder/bin/splunk start --accept-license expect "Please enter an administrator username: " send -- "admin\r" expect "Please enter a new password: " send -- "changeme\r" expect "Please confirm new password: " send -- "changeme\r" expect eof
      
      





最初の起動時に、Splunkはユーザー名/パスワードの入力を求めますが、このデータはこの特定のインストール、つまりコンテナ内の管理コマンドを実行するためにのみ使用されます。 私たちの場合、すべてが機能し、ログが水のように流れるように、コンテナを起動するだけです。 もちろん、これはハードコードですが、他の方法は見つかりませんでした。



さらにスクリプトが実行されます



 /splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme
      
      





splunkclouduf.spl-これはSplunk Universal Forwarderのクレジットファイルで、Webインターフェースからダウンロードできます。



クリックしてダウンロードする場所(写真)










これは、解凍できる通常のアーカイブです。 内部-SplunkCloudに接続するための証明書とパスワード、および入力インスタンスのリストを含むoutputs.conf 。 このファイルは、Splunkインストールを再インストールするか、インストールがオンプレミスの場合に入力ノードを追加するまで関連します。 したがって、コンテナ内に追加してもかまいません。



そして最後は再起動です。 はい、変更を適用するには、再起動する必要があります。



inputs.confで 、Splunkに送信するログ追加します。 たとえば、Puppetを使用して設定を分散する場合、このファイルを画像に追加する必要はありません。 主なことは 、デーモンの起動時にフォワーダーが設定を確認することです。そうでない場合、。 / splunkの再起動が必要になります。



どのdocker statsスクリプト? githubにはoutcoldmanからの古いソリューションがあり、そこからスクリプトが取得され、Dockerの現在のバージョン(ce-17。*)およびSplunk(7. *)で動作するように確定されます。



取得したデータを使用して、そのような



ダッシュボード:(数枚の写真)










デザートのソースコードは、記事の最後に示されているカブにあります。 2つの選択フィールドがあることに注意してください。1-インデックス(マスクで検索)を選択し、ホスト/コンテナを選択します。 おそらく、使用する名前に応じて、インデックスマスクを更新する必要があります。



結論として、 開始()関数に注意を払いたい



entrypoint.sh
 start() { trap teardown EXIT if [ -z $SPLUNK_INDEX ]; then echo "'SPLUNK_INDEX' env variable is empty or not defined. Should be 'dev' or 'prd'." >&2 exit 1 else sed -e "s/@index@/$SPLUNK_INDEX/" -i ${SPLUNK_HOME}/etc/system/local/inputs.conf fi sed -e "s/@hostname@/$(cat /etc/hostname)/" -i ${SPLUNK_HOME}/etc/system/local/inputs.conf sh -c "echo 'starting' > /tmp/splunk-container.state" ${SPLUNK_HOME}/bin/splunk start watch_for_failure }
      
      





私の場合、コンテナ内のアプリケーションであろうとホストマシンであろうと、それぞれの環境と個々のエンティティに対して、個別のインデックスを使用します。 そのため、データが大量に蓄積されても検索速度は低下しません。 インデックスに名前を付けるには、単純なルール<environment_name> _ <service / application / etc>を使用します。 したがって、コンテナをユニバーサルにするために、デーモンを直接起動する前に、 sedワイルドカードを環境名に置き換えます。 環境名を持つ変数は、環境変数を介して渡されます。 おかしいですね。



また、何らかの理由で、Splunkはdocker hostnameパラメーターの影響を受けないことにも注意してください。 とにかく、彼は永続的に自分のコンテナのIDからホストフィールドにログを送信します。 解決策として、ホストマシンから/ etc / hostnameをマウントし、起動時にインデックス名に似た置換を行うことができます。



Docker-compose.ymlの例
 version: '2' services: splunk-forwarder: image: "${IMAGE_REPO}/docker-stats-splunk-forwarder:${IMAGE_VERSION}" environment: SPLUNK_INDEX: ${ENVIRONMENT} volumes: - /etc/hostname:/etc/hostname:ro - /var/log:/var/log - /var/run/docker.sock:/var/run/docker.sock:ro
      
      







まとめ



はい、多分「ハードコード」があるので、おそらく解決策は完全ではなく、誰にとっても確かに普遍的ではありません。 しかし、それが基になった場合、DockerでSplunk Forwarderが必要になった場合、誰もが自分のイメージを収集して自分のプライベートアーティファクトに配置できます。



参照:



記事からの解決策

機能の一部を再利用することに触発されたOutcoldmanのソリューション

の。 ユニバーサルフォワーダーのセットアップドキュメント



All Articles