Splunk Universal Forwarder dans Docker en tant que collecteur de journaux système

Splunk Universal Forwarder dans Docker en tant que collecteur de journaux système

Splunk est l'un des produits commerciaux de collecte et d'analyse de journaux les plus reconnaissables. Même aujourd’hui, alors que les ventes ne se font plus en Russie, ce n’est pas une raison pour ne pas rédiger d’instructions/comment faire pour ce produit.

Tâche : collectez les journaux système des nœuds Docker dans Splunk sans modifier la configuration de la machine hôte

Je voudrais commencer par l'approche officielle, qui semble un peu étrange lors de l'utilisation de Docker.
Lien vers le hub Docker
Qu'avons-nous :

1. Image Pullim

$ docker pull splunk/universalforwarder:latest

2. Démarrez le conteneur avec les paramètres nécessaires

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

3. On rentre dans le conteneur

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

Ensuite, il nous est demandé de nous rendre à une adresse connue dans la documentation.

Et configurez le conteneur après son démarrage :


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

Attendez. Quoi?

Mais les surprises ne s'arrêtent pas là. Si vous exécutez le conteneur à partir de l'image officielle en mode interactif, vous verrez ce qui suit :

Un peu de déception


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

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

Super. L'image ne contient même pas d'artefact. Autrement dit, chaque fois que vous démarrez, il faudra du temps pour télécharger l'archive avec les binaires, la décompresser et la configurer.
Et qu'en est-il de Docker-Way et tout ça ?

Non merci. Nous prendrons un chemin différent. Et si nous effectuions toutes ces opérations au stade de l’assemblage ? Alors allons-y!

Afin de ne pas trop tarder, je vous montre tout de suite l'image finale :

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

Alors, que contient

premier_début.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

Au premier démarrage, Splunk vous demande de lui donner un login/mot de passe, MAIS ces données sont utilisées seulement pour exécuter des commandes administratives pour cette installation particulière, c'est-à-dire à l'intérieur du conteneur. Dans notre cas, nous voulons simplement lancer le conteneur pour que tout fonctionne et que les journaux coulent comme une rivière. Bien sûr, c’est du code en dur, mais je n’ai trouvé aucun autre moyen.

De plus, selon le script, il est exécuté

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

splunkclouduf.spl — Il s'agit d'un fichier d'informations d'identification pour Splunk Universal Forwarder, qui peut être téléchargé à partir de l'interface Web.

Où cliquer pour télécharger (en images)Splunk Universal Forwarder dans Docker en tant que collecteur de journaux système

Splunk Universal Forwarder dans Docker en tant que collecteur de journaux système
Il s'agit d'une archive régulière qui peut être décompressée. À l'intérieur se trouvent des certificats et un mot de passe pour vous connecter à notre SplunkCloud et sorties.conf avec une liste de nos instances d’entrée. Ce fichier sera pertinent jusqu'à ce que vous réinstalliez votre installation Splunk ou que vous ajoutiez un nœud d'entrée si l'installation est sur site. Par conséquent, il n’y a rien de mal à l’ajouter à l’intérieur du conteneur.

Et la dernière chose est le redémarrage. Oui, pour appliquer les modifications, vous devez le redémarrer.

Dans notre entrées.conf nous ajoutons les logs que nous souhaitons envoyer à Splunk. Il n'est pas nécessaire d'ajouter ce fichier à l'image si, par exemple, vous distribuez des configs via puppet. La seule chose est que Forwarder voit les configurations au démarrage du démon, sinon il aura besoin de ./redémarrage Splunk.

De quel type de scripts de statistiques Docker s'agit-il ? Il existe une ancienne solution sur Github de homme froid, les scripts ont été extraits de là et modifiés pour fonctionner avec les versions actuelles de Docker (ce-17.*) et Splunk (7.*).

Avec les données obtenues, vous pouvez construire ce qui suit

tableaux de bord : (quelques photos)Splunk Universal Forwarder dans Docker en tant que collecteur de journaux système

Splunk Universal Forwarder dans Docker en tant que collecteur de journaux système
Le code source des tirets se trouve dans le lien fourni à la fin de l'article. Veuillez noter qu'il y a 2 champs de sélection : 1 - sélection d'index (recherche par masque), sélection d'hôte/conteneur. Vous devrez probablement mettre à jour le masque d'index, en fonction des noms que vous utilisez.

En conclusion, je voudrais attirer votre attention sur la fonction démarrer() в

point d'entrée.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
}

Dans mon cas, pour chaque environnement et chaque entité individuelle, qu'il s'agisse d'une application dans un conteneur ou d'une machine hôte, nous utilisons un index distinct. De cette façon, la vitesse de recherche ne souffrira pas en cas d’accumulation importante de données. Une règle simple est utilisée pour nommer les index : _. Par conséquent, pour que le conteneur soit universel, avant de lancer le démon lui-même, nous remplaçons sed-ième caractère générique au nom de l'environnement. La variable de nom d'environnement est transmise via les variables d'environnement. Ça a l'air drôle.

Il convient également de noter que, pour une raison quelconque, Splunk n'est pas affecté par la présence du paramètre docker. nom d'hôte. Il enverra toujours obstinément des logs avec l'identifiant de son conteneur dans le champ host. Comme solution, vous pouvez monter / etc / hostname depuis la machine hôte et au démarrage, effectuez des remplacements similaires aux noms d'index.

Exemple 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

Total

Oui, la solution n'est peut-être pas idéale et certainement pas universelle pour tout le monde, car il existe de nombreux "code dur". Mais sur cette base, chacun peut créer sa propre image et la mettre dans son artefact privé, si, comme cela se produit, vous avez besoin de Splunk Forwarder dans Docker.

Liens:

Solution de l'article
Une solution d'outcoldman qui nous a inspiré à réutiliser certaines fonctionnalités
De. documentation pour la configuration d'Universal Forwarder

Source: habr.com

Achetez un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Achetez un hébergement web fiable avec protection DDoS, serveurs VPS et VDS | ProHoster