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



Splunk est le produit commercial le plus connu pour collecter et analyser les journaux. Même maintenant, quand Splunk a arrêté ses ventes en Fédération de Russie. Et ce n'est pas une raison pour ne pas écrire les articles pratiques sur ce produit.

Objectif : rassembler les journaux du système à partir des nœuds Docker sans modifier la configuration de la machine de l'hôte

Commençons par la manière officielle qui semble bizarre avec l'utilisation de Docker.
Lien vers le hub Docker

Étapes de configuration:

1. Pull image

$ docker pull splunk/universalforwarder:latest 

2. Exécutez le conteneur avec les paramètres dont vous avez besoin

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

3. Connectez-vous au conteneur

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

Ensuite, nous devrions visiter la page Docs.

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. Quoi?
Mais ce n'est pas la dernière surprise. Si vous exécutez le conteneur officiel en mode interactif, vous:

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

Super L'image Docker ne contient pas d'artefact. Ainsi, chaque fois que vous exécutez le conteneur, vous téléchargerez des binaires, le décompacterez, le configurerez.
Et Docker-Way? Où est-il?

Non merci Nous choisirons la bonne voie. Et si nous exécutons toutes les commandes pendant la phase de construction? Continuons!

Pour sauter la partie ennuyeuse, il y a une image finale:

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

Ainsi, le contenu de

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 demandera un identifiant / mot de passe, mais les informations d'identification ne peuvent être utilisées que pour l'exécution des commandes d'administration dans cette installation particulière, à l'intérieur du conteneur. Dans notre cas, nous voulons simplement exécuter le conteneur et tout devrait fonctionner sans aucune action. Cela peut ressembler à du "hardcode", mais je n'ai trouvé aucune autre solution.
La prochaine étape de la construction est

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

splunkclouduf.spl - Il s'agit du fichier d'informations d'identification Splunk Universal Forwarder, que vous pouvez télécharger via l'interface utilisateur.

Sur quels boutons dois-je appuyer (images)



Il s'agit d'une archive simple que vous pouvez facilement décompresser. Il contient - des certificats et un mot de passe pour se connecter à notre SplunkCloud; sorties.conf avec la liste des nœuds d'entrée. Ce fichier sera réel sauf si vous réinstallez l'installation Splunk ou ajoutez de nouveaux nœuds d'entrée s'il est sur site. Quoi qu'il en soit, rien de grave ne se produira si vous le mettez à l'image.

La dernière étape - redémarrez. Oui, pour appliquer la configuration, elle doit être redémarrée.

Ajoutez les journaux dans inputs.conf que nous voulons envoyer à Splunk. Si vous livrez la configuration via Puppet, vous n'avez pas besoin d'ajouter cette configuration à l'image. N'oubliez pas que le fichier de configuration doit être monté.

Quels sont les scripts de statistiques de docker? Vous pouvez trouver la solution sur le Github de outcoldman , j'ai choisi des scripts à partir de là et l'ai mis à jour pour le laisser fonctionner avec les versions réelles de Docker (ce-17. *) Et Splunk (7. *).
Vous pouvez créer des tableaux de bord sophistiqués avec des données collectées:

Tableaux de bord: (photos)



Vous pouvez trouver le code source du tableau de bord dans le référentiel, que j'ai mentionné à la fin de l'article. Faites attention au 1er champ de sélection: choisissez l'index (recherche par le masque). Vous devrez mettre à jour le masque. Cela dépend des noms d'index que vous avez.

À la fin, je veux faire attention à la fonction start () à l'intérieur

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 pour chaque service, peu importe la machine hôte ou l'application docker, nous créons un index séparé. Il empêche la vitesse de recherche de diminuer car la grande quantité de données se trouve dans l'index. Nous utilisons une règle de conversion de dénomination simple: <environment_name> _ <service / application / etc> . Ainsi, pour créer un conteneur universel, nous remplaçons le caractère générique par le nom d'environnement par sed . La variable de nom d'environnement hérite de la variable d'environnement. Ça a l'air drôle.

En outre, je tiens à souligner que, pour une raison quelconque, Splunk n'utilise pas le nom d' hôte du paramètre Docker comme champ d'hôte dans les journaux. Il continuera à envoyer des journaux avec host = <forwarder_container_id> même si vous définissez le paramètre hostname. Solution: vous pouvez monter / etc / hostname à partir de la machine hôte et remplacer le paramètre hôte comme les noms d'index.

Exemple avec 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, peut-être, ma solution n'est peut-être pas idéale et elle n'est pas exactement universelle pour tout le monde car elle contient du "hardcode" . Mais cela pourrait être utile pour quelqu'un qui peut créer sa propre image et la placer dans le registre privé. Surtout si vous avez besoin de Splunk Forwarder dans le Docker.

Liens:

Cette solution
Solution de outcoldman qui m'a inspiré pour réutiliser certaines fonctionnalités
Page de documentation officielle. Configuration du transitaire universel

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


All Articles