Splunk Universal Forwarder di docker sebagai logger sistem



Splunk adalah salah satu dari beberapa produk komersial yang paling dikenal untuk mengumpulkan dan menganalisis log. Bahkan sekarang, ketika penjualan di Rusia tidak lagi dilakukan, ini bukan alasan untuk tidak menulis petunjuk bagaimana caranya untuk produk ini.

Tugas : mengumpulkan log sistem dari node docker di Splunk tanpa mengubah konfigurasi host

Saya ingin memulai dengan pendekatan resmi, yang terlihat aneh ketika menggunakan buruh pelabuhan.
Tautan ke hub Docker
Apa yang kita miliki:

1. Gambar pullim

$ docker pull splunk/universalforwarder:latest 

2. Kami memulai wadah dengan parameter yang diperlukan

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

3. Kami pergi ke wadah

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

Selanjutnya, kita diminta untuk pergi ke alamat yang dikenal dalam dokumentasi.

Dan konfigurasikan wadah setelah dimulai:

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

Tunggu sebentar. Apa?

Namun kejutan tidak berakhir di situ. Jika Anda menjalankan wadah dari gambar resmi dalam mode interaktif, Anda akan melihat yang berikut:

Sedikit kekecewaan
 $ 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 *********    ... 

Bagus Gambar itu bahkan tidak memiliki artefak. Artinya, setiap kali Anda memulainya akan membutuhkan waktu untuk mengunduh arsip dengan binari, membongkar dan mengonfigurasi.
Tapi bagaimana dengan cara buruh pelabuhan dan semua itu?

Tidak terima kasih Kami akan pergi ke arah lain. Bagaimana jika kita melakukan semua operasi ini pada tahap perakitan? Ayo pergi!

Agar tidak menarik untuk waktu yang lama, saya akan segera menampilkan gambar terakhir:

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" ] 

Jadi, apa yang terkandung di dalamnya

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 

Pada awal pertama, Splunk meminta nama pengguna / kata sandi, TETAPI data ini hanya digunakan untuk menjalankan perintah administratif untuk instalasi khusus ini, yaitu di dalam wadah. Dalam kasus kami, kami hanya ingin meluncurkan wadah sehingga semuanya berfungsi dan log mengalir seperti air. Tentu saja, ini hardcode, tetapi saya belum menemukan cara lain.

Selanjutnya skrip dieksekusi

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

splunkclouduf.spl - Ini adalah file kredit untuk Splunk Universal Forwarder, yang dapat diunduh dari antarmuka web.

Tempat mengeklik untuk mengunduh (dalam gambar)



Ini adalah arsip reguler yang dapat Anda unzip. Di dalam - sertifikat dan kata sandi untuk menghubungkan ke SplunkCloud kami dan outputs.conf dengan daftar instance input kami. File ini akan relevan sampai Anda menginstal ulang instalasi Splunk Anda atau menambahkan simpul input jika instalasi di tempat. Karenanya, tidak apa-apa menambahkannya di dalam wadah.

Dan yang terakhir adalah restart. Ya, untuk menerapkan perubahan, Anda harus memulai ulang.

Di inputs.conf kami, kami menambahkan log yang ingin kami kirim ke Splunk. Tidak perlu menambahkan file ini ke gambar jika, misalnya, Anda menyebarkan konfigurasi melalui boneka. Yang utama adalah bahwa Forwarder melihat konfigurasi ketika daemon dimulai, jika tidak ./splunk restart akan diperlukan.

Apa skrip statistik buruh pelabuhan? Github memiliki solusi lama dari outcoldman , skrip diambil dari sana dan diselesaikan untuk bekerja dengan versi Docker saat ini (ce-17. *) Dan Splunk (7. *).

Dengan data yang diperoleh, Anda dapat membangunnya

dasbor: (beberapa gambar)



Kode sumber deshes terletak di lobak yang ditunjukkan di akhir artikel. Harap dicatat bahwa ada 2 bidang pilih: 1 - pilih indeks (dicari dengan mask), pilih host / wadah. Anda mungkin harus memperbarui topeng indeks, tergantung pada nama yang Anda gunakan.

Sebagai kesimpulan, saya ingin memperhatikan fungsi start () di

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 } 

Dalam kasus saya, untuk setiap lingkungan dan setiap entitas individu, apakah itu aplikasi dalam wadah atau mesin host, kami menggunakan indeks terpisah. Jadi kecepatan pencarian tidak akan menderita dengan akumulasi data yang signifikan. Aturan sederhana digunakan untuk memberi nama indeks: <environment_name> _ <service / application / etc> . Oleh karena itu, untuk membuat wadah universal, sebelum memulai daemon secara langsung, kami mengganti wildcard sed dengan nama lingkungan. Variabel dengan nama lingkungan dilewatkan melalui variabel lingkungan. Kedengarannya lucu.

Perlu juga dicatat bahwa karena alasan tertentu, Splunk tidak terpengaruh oleh parameter nama host buruh pelabuhan. Bagaimanapun, ia akan terus mengirim log dari id wadahnya ke bidang host. Sebagai solusinya, Anda dapat me-mount / etc / hostname dari mesin host dan, saat startup, membuat pengganti yang mirip dengan nama indeks.

Contoh 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 


Ringkasan

Ya, mungkin solusinya tidak sempurna dan tentu saja tidak universal untuk semua orang, karena ada banyak "hardcode" . Tetapi atas dasar itu, semua orang dapat mengumpulkan gambar mereka sendiri dan menaruhnya di artefak pribadi mereka sendiri, jika, seperti yang terjadi, Anda memerlukan Splunk Forwarder di buruh pelabuhan.

Referensi:

Solusi dari artikel
Solusi Outcoldman terinspirasi untuk menggunakan kembali bagian dari fungsionalitas
Dari Dokumentasi pengaturan Universal Forwarder

Source: https://habr.com/ru/post/id447402/


All Articles