Splunk Universal Forwarder di Docker sebagai pengumpul log sistem



Splunk adalah produk komersial paling terkenal untuk mengumpulkan dan menganalisis log. Bahkan sekarang, ketika Splunk telah menghentikan penjualan di Federasi Rusia. Dan itu bukan alasan untuk tidak menulis artikel bagaimana-tentang tentang produk ini.

Sasaran : mengumpulkan log sistem dari node Docker tanpa mengubah konfigurasi mesin host

Mari kita mulai dengan cara resmi yang terasa aneh dengan penggunaan Docker.
Tautan hub docker

Langkah-langkah konfigurasi:

1. Tarik gambar

$ docker pull splunk/universalforwarder:latest 

2. Jalankan wadah dengan parameter yang Anda butuhkan

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

3. Masuk ke dalam wadah

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

Maka kita harus mengunjungi halaman Documents.

Dan konfigurasikan wadah setelah dimulai:

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

Tunggu Apa?
Tapi ini bukan kejutan terakhir. Jika Anda menjalankan wadah resmi dalam mode interaktif, Anda akan:

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 ********* etc... 

Bagus Gambar Docker tidak mengandung artefak. Jadi, setiap kali Anda menjalankan wadah, Anda akan mengunduh binari, membongkar, mengaturnya.
Bagaimana dengan cara buruh pelabuhan? Dimana itu?

Tidak, terima kasih Kami akan memilih cara yang benar. Bagaimana jika kita menjalankan semua perintah selama tahap pembangunan? Ayo pergi!

Untuk melewati bagian yang membosankan, ada gambar terakhir:

Dockerfile
 # Depends on your preferences FROM centos:7 # Define env variables only once and don't define it any more ENV SPLUNK_HOME /splunkforwarder ENV SPLUNK_ROLE splunk_heavy_forwarder ENV SPLUNK_PASSWORD changeme ENV SPLUNK_START_ARGS --accept-license # Install required packages # wget - to download artifacts # expect - for the first run step of Splunk for build stage # jq - using in the shell scripts RUN yum install -y epel-release \ && yum install -y wget expect jq # Download, unpack, remove 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 # Everything is simple with shell scripts, but inputs.conf, splunkclouduf.spl and first_start.sh should have an explanation. I'll tell more about it below. 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/ # Grant execute permissions, add user, execute pre-configuration 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 scripts COPY [ "init/entrypoint.sh", "init/checkstate.sh", "/sbin/" ] # It depends. If you need it locally - go on. 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, isinya

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 

Selama awal pertama Splunk akan meminta login / kata sandi, TETAPI kredensial hanya dapat digunakan untuk eksekusi perintah admin dalam instalasi khusus ini, di dalam wadah. Dalam kasus kami, kami hanya ingin menjalankan wadah dan semuanya harus bekerja tanpa tindakan apa pun. Mungkin terlihat seperti "hardcode", tetapi saya belum menemukan solusi lain.
Langkah selanjutnya adalah membangun

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

splunkclouduf.spl - Ini adalah file kredensial Splunk Universal Forwarder, yang dapat Anda unduh melalui UI.

Tombol mana yang harus saya tekan (gambar)



Ini adalah arsip sederhana yang dapat Anda buka dengan mudah. Ini berisi - sertifikat dan kata sandi untuk terhubung ke SplunkCloud kami; outputs.conf dengan daftar node input. File ini akan menjadi aktual kecuali jika Anda menginstal ulang instalasi Splunk atau menambahkan node input baru jika ada di tempat. Bagaimanapun, tidak ada yang serius yang akan terjadi jika Anda meletakkannya di gambar.

Langkah terakhir - restart. Ya, untuk menerapkan konfigurasi, itu perlu dimulai ulang.

Tambahkan log ke inputs.conf yang ingin kami kirim ke Splunk. Jika Anda memberikan konfigurasi melalui Wayang, Anda tidak perlu menambahkan konfigurasi ini ke gambar. Perlu diingat bahwa file konfigurasi harus dipasang.

Apa skrip stat docker? Anda dapat menemukan solusi pada Github dari outcoldman , saya mengambil skrip dari sana dan memperbaruinya agar berfungsi dengan versi aktual Docker (ce-17. *) Dan Splunk (7. *).
Anda dapat membuat dasbor mewah dengan data yang dikumpulkan:

Dasbor: (gambar)



Anda dapat menemukan kode sumber dasbor di repo, yang saya sebutkan di akhir artikel. Perhatikan bidang pilih 1: pilih indeks (cari berdasarkan topeng). Anda harus memperbarui topeng. Itu tergantung pada nama indeks yang Anda miliki.

Pada akhirnya, saya ingin memperhatikan fungsi start () di dalamnya

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 untuk setiap layanan, tidak masalah dengan mesin host atau aplikasi buruh pelabuhan, kami membuat indeks terpisah. Ini mencegah kecepatan pencarian berkurang dengan tingginya jumlah data yang ada di indeks. Kami menggunakan aturan konversi penamaan sederhana: <environment_name> _ <layanan / aplikasi / dll> . Jadi, untuk membuat wadah universal, kami mengganti wildcard dengan nama lingkungan dengan sed . Variabel nama lingkungan diwariskan oleh variabel lingkungan. Kedengarannya lucu.

Juga, saya ingin menunjukkan bahwa dengan beberapa alasan Splunk tidak menggunakan parameter nama host parameter docker sebagai bidang host dalam log. Ini akan terus mengirim log dengan host = <forwarder_container_id> bahkan jika Anda menentukan parameter nama host. Solusi: Anda dapat memasang / etc / hostname dari mesin host dan mengganti parameter host seperti 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, solusi saya mungkin tidak ideal dan itu sebenarnya tidak universal untuk semua orang karena mengandung "hardcode" . Tetapi mungkin bermanfaat bagi seseorang yang dapat membangun citranya sendiri dan menempatkannya di registri pribadi. Apalagi jika Anda membutuhkan Splunk Forwarder di Docker.

Tautan:

Solusi ini
Solusi dari outcoldman yang memberi saya inspirasi untuk menggunakan kembali beberapa fungsi
Halaman dokumentasi resmi. Konfigurasi forwarder universal

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


All Articles