Splunk adalah salah satu dari beberapa produk pengumpulan dan analisis log komersial yang paling dikenal. Bahkan sekarang, ketika penjualan tidak lagi dilakukan di Rusia, ini bukan alasan untuk tidak menulis instruksi/cara untuk produk ini.
Tugas: mengumpulkan log sistem dari node buruh pelabuhan di Splunk tanpa mengubah konfigurasi mesin host
Saya ingin memulai dengan pendekatan resmi, yang terlihat agak aneh saat menggunakan Docker.
Apa yang kita punya:
1. Gambar Pullim
$ docker pull splunk/universalforwarder:latest
2. Mulai 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. Kita masuk ke dalam wadah
docker exec -it <container-id> /bin/bash
Selanjutnya kita diminta pergi ke alamat yang diketahui di 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. Apa?
Namun kejutannya tidak berakhir di situ. Jika Anda menjalankan container dari image 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 *********
Π½Ρ ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅...
Besar. Gambar tersebut bahkan tidak mengandung artefak. Artinya, setiap kali Anda memulai, diperlukan waktu untuk mengunduh arsip dengan binari, membongkar, dan mengonfigurasi.
Bagaimana dengan cara buruh pelabuhan dan sebagainya?
Tidak, terima kasih. Kami akan mengambil rute yang berbeda. Bagaimana jika kita melakukan semua operasi ini pada tahap perakitan? Kalau begitu ayo pergi!
Agar tidak menunda terlalu lama, saya akan segera menunjukkan gambar akhirnya:
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 -- "adminr"
expect "Please enter a new password: "
send -- "changemer"
expect "Please confirm new password: "
send -- "changemer"
expect eof
Pada permulaan pertama, Splunk meminta Anda memberikan login/kata sandi, TETAPI data ini digunakan hanya untuk menjalankan perintah administratif untuk instalasi tertentu, yaitu di dalam container. Dalam kasus kami, kami hanya ingin meluncurkan container sehingga semuanya berfungsi dan batang kayu mengalir seperti sungai. Tentu saja ini hardcode, tetapi saya belum menemukan cara lain.
Selanjutnya sesuai skrip dijalankan
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme
splunkclouduf.spl β Ini adalah file kredensial untuk Splunk Universal Forwarder, yang dapat diunduh dari antarmuka web.
Di mana mengklik untuk mengunduh (dalam gambar)
Ini adalah arsip biasa yang dapat dibongkar. Di dalamnya terdapat sertifikat dan kata sandi untuk menghubungkan ke SplunkCloud kami dan keluaran.conf dengan daftar contoh masukan kami. File ini akan relevan sampai Anda menginstal ulang instalasi Splunk atau menambahkan node input jika instalasi dilakukan di lokasi. Oleh karena itu, tidak ada salahnya menambahkannya ke dalam wadah.
Dan yang terakhir adalah restart. Ya, untuk menerapkan perubahan, Anda perlu memulai ulang.
Di kami input.conf kami menambahkan log yang ingin kami kirim ke Splunk. File ini tidak perlu ditambahkan ke gambar jika, misalnya, Anda mendistribusikan konfigurasi melalui boneka. Satu-satunya hal adalah Forwarder melihat konfigurasi ketika daemon dimulai, jika tidak maka akan diperlukan ./splunk memulai ulang.
Skrip statistik buruh pelabuhan macam apa itu? Ada solusi lama di Github dari
Dengan data yang diperoleh, Anda dapat membangun yang berikut ini
dasbor: (beberapa gambar)
Kode sumber tanda hubung ada di tautan yang disediakan di akhir artikel. Harap dicatat bahwa ada 2 bidang pilihan: 1 - pemilihan indeks (dicari berdasarkan topeng), pemilihan host/kontainer. Anda mungkin perlu memperbarui masker indeks, bergantung pada nama yang Anda gunakan.
Sebagai kesimpulan, saya ingin menarik perhatian Anda pada fungsinya Mulailah() Π²
titik masuk.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 individual, baik itu aplikasi dalam wadah atau mesin host, kami menggunakan indeks terpisah. Dengan cara ini, kecepatan pencarian tidak akan berkurang ketika terdapat akumulasi data yang signifikan. Aturan sederhana digunakan untuk memberi nama indeks: _. Oleh karena itu, agar containernya bersifat universal, sebelum meluncurkan daemon itu sendiri, kami menggantinya sed-karakter pengganti ke nama lingkungan. Variabel nama lingkungan diteruskan melalui variabel lingkungan. Terdengar lucu.
Perlu juga dicatat bahwa karena alasan tertentu Splunk tidak terpengaruh oleh keberadaan parameter buruh pelabuhan hostname. Dia masih akan dengan keras kepala mengirimkan log dengan id wadahnya di bidang host. Sebagai solusinya, Anda bisa melakukan mount / etc / hostname dari mesin host dan saat startup lakukan penggantian yang mirip dengan nama indeks.
Contoh buruh pelabuhan-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
Total
Ya, mungkin solusinya tidak ideal dan tentunya tidak universal untuk semua orang, karena ada banyak solusinya "Kode keras". Namun berdasarkan hal tersebut, setiap orang dapat membangun image mereka sendiri dan menaruhnya di artefak pribadi mereka, jika, kebetulan, Anda memerlukan Splunk Forwarder di Docker.
Π‘ΡΡΠ»ΠΊΠΈ:
Sumber: www.habr.com