Splunk Universal Forwarder trong docker với tư cách là trình thu thập nhật ký hệ thống

Splunk Universal Forwarder trong docker với tư cách là trình thu thập nhật ký hệ thống

Splunk là một trong những sản phẩm phân tích và thu thập nhật ký thương mại dễ nhận biết nhất. Ngay cả bây giờ, khi việc bán hàng không còn được thực hiện ở Nga nữa, đây không phải là lý do để không viết hướng dẫn/cách làm cho sản phẩm này.

Nhiệm vụ: thu thập nhật ký hệ thống từ các nút docker trong Splunk mà không thay đổi cấu hình máy chủ

Tôi muốn bắt đầu với cách tiếp cận chính thức, cách này có vẻ hơi lạ khi sử dụng Docker.
Liên kết đến trung tâm Docker
Những gì chúng ta có:

1. Hình ảnh Pullim

$ docker pull splunk/universalforwarder:latest

2. Khởi động container với các thông số cần thiết

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

3. Chúng ta vào container

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

Tiếp theo, chúng tôi được yêu cầu đến một địa chỉ đã biết trong tài liệu.

Và định cấu hình vùng chứa sau khi nó khởi động:


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

Chờ đợi. Cái gì?

Nhưng những điều ngạc nhiên không kết thúc ở đó. Nếu bạn chạy vùng chứa từ hình ảnh chính thức ở chế độ tương tác, bạn sẽ thấy như sau:

Một chút thất vọng


$ 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 *********

ну и так далее...

Tuyệt vời. Hình ảnh thậm chí không chứa một hiện vật. Nghĩa là, mỗi khi bạn khởi động, bạn sẽ mất thời gian để tải xuống kho lưu trữ có tệp nhị phân, giải nén và cấu hình.
Thế còn docker-way và tất cả những thứ đó thì sao?

Không, cám ơn. Chúng ta sẽ đi một con đường khác. Điều gì sẽ xảy ra nếu chúng ta thực hiện tất cả các thao tác này ở giai đoạn lắp ráp? Đi thôi nào!

Để không trì hoãn quá lâu, tôi sẽ cho bạn xem ngay hình ảnh cuối cùng:

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

Vậy những gì chứa đựng trong

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

Ở lần khởi động đầu tiên, Splunk yêu cầu bạn cung cấp thông tin đăng nhập/mật khẩu, NHƯNG dữ liệu này được sử dụng chỉ để thực thi các lệnh quản trị cho cài đặt cụ thể đó, nghĩa là bên trong vùng chứa. Trong trường hợp của chúng tôi, chúng tôi chỉ muốn khởi chạy container để mọi thứ hoạt động và các khúc gỗ chảy như sông. Tất nhiên, đây là hardcode, nhưng tôi chưa tìm được cách nào khác.

Hơn nữa theo kịch bản được thực thi

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

splunkclouduf.spl — Đây là tệp thông tin xác thực cho Splunk Universal Forwarder, có thể tải xuống từ giao diện web.

Bấm vào đâu để tải về (bằng hình ảnh)Splunk Universal Forwarder trong docker với tư cách là trình thu thập nhật ký hệ thống

Splunk Universal Forwarder trong docker với tư cách là trình thu thập nhật ký hệ thống
Đây là một kho lưu trữ thông thường có thể được giải nén. Bên trong là các chứng chỉ và mật khẩu để kết nối với SplunkCloud của chúng tôi và đầu ra.conf với danh sách các phiên bản đầu vào của chúng tôi. Tệp này sẽ có liên quan cho đến khi bạn cài đặt lại cài đặt Splunk hoặc thêm nút đầu vào nếu cài đặt tại chỗ. Vì vậy, không có gì sai khi thêm nó vào trong vùng chứa.

Và điều cuối cùng là khởi động lại. Có, để áp dụng các thay đổi, bạn cần khởi động lại nó.

Trong của chúng tôi input.conf chúng tôi thêm nhật ký mà chúng tôi muốn gửi tới Splunk. Không cần thiết phải thêm tệp này vào hình ảnh nếu chẳng hạn như bạn phân phối cấu hình qua con rối. Điều duy nhất là Forwarder nhìn thấy các config khi daemon khởi động, nếu không sẽ cần ./splunk khởi động lại.

Chúng là loại tập lệnh thống kê docker nào? Có một giải pháp cũ trên Github từ người bán đứng, các tập lệnh được lấy từ đó và sửa đổi để hoạt động với các phiên bản hiện tại của Docker (ce-17.*) và Splunk (7.*).

Với dữ liệu thu được, bạn có thể xây dựng như sau

bảng điều khiển: (một vài hình ảnh)Splunk Universal Forwarder trong docker với tư cách là trình thu thập nhật ký hệ thống

Splunk Universal Forwarder trong docker với tư cách là trình thu thập nhật ký hệ thống
Mã nguồn của dấu gạch ngang nằm trong link được cung cấp ở cuối bài viết. Xin lưu ý rằng có 2 trường chọn: 1 - lựa chọn chỉ mục (được tìm kiếm theo mặt nạ), lựa chọn máy chủ/vùng chứa. Bạn có thể sẽ cần cập nhật mặt nạ chỉ mục, tùy thuộc vào tên bạn sử dụng.

Tóm lại, tôi muốn bạn chú ý đến chức năng khởi đầu() в

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
}

Trong trường hợp của tôi, đối với từng môi trường và từng thực thể riêng lẻ, có thể là ứng dụng trong vùng chứa hoặc máy chủ, chúng tôi sử dụng một chỉ mục riêng. Bằng cách này, tốc độ tìm kiếm sẽ không bị ảnh hưởng khi có sự tích lũy dữ liệu đáng kể. Một quy tắc đơn giản được sử dụng để đặt tên cho chỉ mục: _. Do đó, để container có tính phổ quát, trước khi khởi chạy daemon, chúng ta thay thế khát-ký tự đại diện thứ cho tên của môi trường. Biến tên môi trường được truyền qua các biến môi trường. Nghe vui nhỉ.

Cũng cần lưu ý rằng vì một số lý do, Splunk không bị ảnh hưởng bởi sự hiện diện của tham số docker hostname. Anh ta vẫn ngoan cố gửi nhật ký có id vùng chứa của mình trong trường máy chủ. Là một giải pháp, bạn có thể gắn kết / etc / hostname từ máy chủ và khi khởi động thực hiện thay thế tương tự như tên chỉ mục.

Ví dụ 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

Tổng

Đúng, có lẽ giải pháp này không lý tưởng và chắc chắn không phổ biến cho tất cả mọi người, vì có rất nhiều giải pháp. "mã cứng". Nhưng dựa trên nó, mọi người đều có thể xây dựng hình ảnh của riêng mình và đặt nó vào kho tạo tác riêng của họ, nếu điều đó xảy ra, bạn cần Splunk Forwarder trong Docker.

Links:

Giải pháp từ bài viết
Một giải pháp từ outcoldman đã truyền cảm hứng cho chúng tôi sử dụng lại một số chức năng
Của. tài liệu cài đặt Universal Forwarder

Nguồn: www.habr.com

Thêm một lời nhận xét