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.
Qu'avons-nous :
1. Image Pullim
$ docker pull splunk/universalforwarder:latest2. 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:latest3. On rentre dans le conteneur
docker exec -it <container-id> /bin/bashEnsuite, 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 eofAu 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:changemesplunkclouduf.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)
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 , 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)
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:roTotal
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:
Source: habr.com
