Если вы тут оказались, то значит вы также, как и я захотели отправлять вывод своих скриптов в Elasticsearch. По умолчанию в стеке ELK запускать скрипты можно только используя Logstash. Но конечно ставить на все хосты Logstash как-то не хочется, и тут вопрос не в том, что просто не хочется, а в том насколько это целесообразно.

Так вот к сути, есть неофициальные агенты для ELK, которые конечно же написаны энтузиастами, и никто вам не гарантирует что они будут работать идеально. Но что уже хорошо, так это то, что список этих агентов есть на офсайте.

Execbeat

И для нашей темы интересен агент Execbeat, так как благодаря ему мы можем запускать команды (скрипты) на Windows или Linux. Можно заметить, что по сути проект уже давно не обновлялся, поэтому использовать его или нет хороший вопрос, на который вы должны найти ответ сами.

Установка

Переходим по ссылке с релизами, где выбираем последний и скачиваем нужный нам файл.

Windows

Скачиваем архив и распаковываем в нужную нам директорию.

Linux

wget https://github.com/christiangalsterer/execbeat/releases/download/3.3.0/execbeat-3.3.0-i686.rpm
sudo yum -y install execbeat-3.3.0-i686.rpm
ls /etc/execbeat

Настройка

Дальнейшие шаги будут идентичны для обоих типов ОС, поэтому не буду расписывать отдельно для каждой.

  1. Для начала стоит заменить содержимое файла execbeat.template.json на содержимое этого файла.
  2. Далее создаём шаблон индекса для execbeat, сам файл тут.
     PUT _index_template/execbeat-main
    {
      "priority": 98,
      "template": {
    "mappings": {
      "_routing": {
        "required": false
      },
      "numeric_detection": false,
      "_meta": {
        "beat": "execbeat",
        "version": "5.6.2"
      },
      "_source": {
        "excludes": [],
        "includes": [],
        "enabled": true
      },
      "dynamic": true,
      "dynamic_templates": [
        {
          "strings_as_keyword": {
            "mapping": {
              "ignore_above": 1024,
              "type": "keyword"
            },
            "match_mapping_type": "string"
          }
        }
      ],
      "date_detection": false,
      "properties": {
        "@timestamp": {
          "type": "date"
        },
        "meta": {
          "type": "object",
          "properties": {
            "cloud": {
              "type": "object",
              "properties": {
                "machine_type": {
                  "type": "keyword"
                },
                "availability_zone": {
                  "type": "keyword"
                },
                "instance_id": {
                  "type": "keyword"
                },
                "project_id": {
                  "type": "keyword"
                },
                "provider": {
                  "type": "keyword"
                },
                "region": {
                  "type": "keyword"
                }
              }
            }
          }
        },
        "beat": {
          "type": "object",
          "properties": {
            "hostname": {
              "eager_global_ordinals": false,
              "index_phrases": false,
              "fielddata": false,
              "norms": true,
              "index": true,
              "store": false,
              "type": "text",
              "index_options": "positions"
            },
            "name": {
              "eager_global_ordinals": false,
              "index_phrases": false,
              "fielddata": false,
              "norms": true,
              "index": true,
              "store": false,
              "type": "text",
              "index_options": "positions"
            },
            "version": {
              "eager_global_ordinals": false,
              "index_phrases": false,
              "fielddata": false,
              "norms": true,
              "index": true,
              "store": false,
              "type": "text",
              "index_options": "positions"
            }
          }
        },
        "exec": {
          "type": "object",
          "properties": {
            "stdout": {
              "eager_global_ordinals": false,
              "index_phrases": false,
              "fielddata": false,
              "norms": true,
              "index": true,
              "store": false,
              "type": "text",
              "index_options": "positions"
            },
            "exitCode": {
              "coerce": true,
              "index": true,
              "ignore_malformed": false,
              "store": false,
              "type": "long",
              "doc_values": true
            },
            "stderr": {
              "type": "keyword"
            },
            "command": {
              "eager_global_ordinals": false,
              "index_phrases": false,
              "fielddata": false,
              "norms": true,
              "index": true,
              "store": false,
              "type": "text",
              "index_options": "positions"
            }
          }
        },
        "tags": {
          "type": "keyword"
        }
      }
    }
      },
      "index_patterns": [
    "execbeat-*"
      ],
      "composed_of": []
    }
    
  3. Создаём скрипт в той же директории getLicenseInfo.bat
    powershell.exe .\getLicenseInfo.ps1
    
  4. Добавляем этот скрипт в планировщик, редактируя файл execbeat.yml.
execbeat:

  commands:

    -
      schedule: "@every 5m"
      command: .\getLicenseInfo.bat
    -
      schedule: "@every 5m"
      command: .\GetVeeamBackups.bat

5.Прописываем куда отправлять вывод, всё в том же файле

output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["elknode2:9000","elknode1:9000"]

  # Optional protocol and basic auth credentials.
  loadbalance: true
  protocol: "https"
  username: "execbeat"
  password: "5YQ2cN"

Запуск

Теперь осталось только запустить сам Execbeat.

sudo execbeat.sh -e
.\execbeat.exe -c .\execbeat.yml -e -d "*"

Итог

На данный момент автор еще не добавил поддержку Elasticsearch версии 7.x, что собственно наталкивает на мысли о необходимости его использования. Вполне возможно, что лучше будет выводить ответы в текстовый файл и уже его отправлять в Elasticsearch с помощью Filebeat. По крайней мере тут точно будет работать с Logstash, у меня данные через Logstash не приходили с Execbeat.