Splunk Universal Forwarder dans docker comme enregistreur de système



Splunk est l'un des produits commerciaux les plus reconnus pour la collecte et l'analyse de journaux. Même maintenant, lorsque les ventes en Russie ne sont plus effectuées, ce n'est pas une raison pour ne pas écrire d'instructions / de procédures sur ce produit.

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

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

1. Image Pullim

$ docker pull splunk/universalforwarder:latest 

2. Nous commençons 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 entre dans le container

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

Ensuite, on nous demande d'aller à l'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 

Attends un instant. 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 n'a 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, décompresser et configurer.
Mais qu'en est-il du docker-way et de tout ça?

Non merci. Nous irons dans l'autre sens. Et si nous effectuions toutes ces opérations au stade de l'assemblage? Alors allons-y!

Afin de ne pas tirer trop longtemps, je vais immédiatement montrer 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" ] 

Et donc, ce qui est contenu dans

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 

Au premier démarrage, Splunk demande un nom d'utilisateur / mot de passe, MAIS ces données ne sont utilisées que pour exécuter les commandes administratives de 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 bûches coulent comme de l'eau. Bien sûr, c'est du hardcode, mais je n'ai pas trouvé d'autres moyens.

Plus loin, le script est exécuté

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

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

Où cliquer pour télécharger (en images)



Il s'agit d'une archive régulière que vous pouvez décompresser. À l'intérieur - certificats et mot de passe pour se connecter à notre SplunkCloud et outputs.conf avec une liste de nos instances d'entrée. Ce fichier sera pertinent jusqu'à ce que vous réinstalliez votre installation Splunk ou ajoutiez un nœud d'entrée si l'installation est sur site. Par conséquent, il est correct de l'ajouter à l'intérieur du conteneur.

Et le dernier est de redémarrer. Oui, pour appliquer les modifications, vous devez le redémarrer.

Dans notre inputs.conf, nous ajoutons les journaux que nous voulons envoyer à Splunk. Il n'est pas nécessaire d'ajouter ce fichier à l'image si, par exemple, vous dispersez des configurations à travers des marionnettes. L'essentiel est que Forwarder voit les configurations au démarrage du démon, sinon un redémarrage ./splunk sera nécessaire.

Quels scripts de statistiques Docker? Le github a une ancienne solution de outcoldman , les scripts sont extraits de là et finalisés pour fonctionner avec les versions actuelles de Docker (ce-17. *) Et Splunk (7. *).

Avec les données obtenues, vous pouvez construire de telles

tableaux de bord: (quelques photos)



Le code source des deshes se trouve dans le navet indiqué à la fin de l'article. Veuillez noter qu'il y a 2 champs de sélection: 1 - sélectionnez l'index (recherché par masque), sélectionnez l'hôte / conteneur. Vous devrez probablement mettre à jour le masque d'index, en fonction des noms que vous utilisez.

En conclusion, je veux faire attention à la fonction start () dans

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 } 

Dans mon cas, pour chaque environnement et chaque entité individuelle, que ce soit une application dans un conteneur ou une machine hôte, nous utilisons un index distinct. La vitesse de recherche ne souffrira donc pas d'une accumulation importante de données. Une règle simple est utilisée pour nommer les index: <environment_name> _ <service / application / etc> . Par conséquent, pour rendre le conteneur universel, avant de démarrer directement le démon, nous remplaçons le caractère générique sed par le nom de l'environnement. Une variable portant un nom d'environnement est transmise via des 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 le paramètre de nom d'hôte du docker. Quoi qu'il en soit, il enverra constamment des journaux de l'ID de son conteneur vers le champ hôte. Comme solution, vous pouvez monter / etc / hostname à partir de la machine hôte et, au démarrage, faire un remplacement similaire 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 


Résumé

Oui, la solution n'est peut-être pas parfaite et certainement pas universelle pour tout le monde, car il y a beaucoup de «hardcode» . Mais sur la base de cela, tout le monde peut collecter son image et la mettre dans son propre artefact privé, si, comme cela s'est produit, vous avez besoin de Splunk Forwarder dans le docker.

Références:

Solution de l'article
La solution d'Outcoldman inspirée pour réutiliser une partie de la fonctionnalité
De. Documentation de configuration de Universal Forwarder

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


All Articles