Исправление Sensu - перезапустить сбойный отслеживаемый процесс

Мы используем sensu для мониторинга определенных процессов на удаленных серверах, на которых установлены клиенты sensu.

Есть ли способ инициировать перезапуск отслеживаемого процесса, когда sensu получает информацию о сбое. Я нашел некоторую информацию в Интернете об обработчике исправления

http://thesoftjaguar.com/posts/2015/06/14/sensu-remediation/

http://dev.nuclearrooster.com/2013/07/27/remediation-with-sensu/

Но это, похоже, не работает для меня, исправление никогда не запускается:

Также есть два ruby-скрипта, которые должны помочь с этим, но не уверен, какой из них использовать:

https://github.com/sensu-plugins/sensu-plugins-sensu/blob/master/bin/handler-sensu.rb

https://github.com/nstielau/sensu-community-plugins/blob/remediation/handlers/remediation/sensu.rb

ОБНОВЛЕНИЕ от 20 апреля:

Мы используем предприятие sensu. Тем временем мне удалось вызвать скрипт remediator.rb, но он не работает должным образом, так как не может прочитать ответ JSON от клиента, и есть следующие исключения:

{"timestamp":"2017-04-20T03:06:41.733000-0700","level":"error","message":"handler output","handler":{"command":"/etc/sensu/plugins/remediator.rb","type":"pipe","timeout":10,"severities":["critical","warning","unknown"],"name":"remediator"},"event":{"id":"f38cd413-575a-46f6-8845-09d713a29815"},"output":["/opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-plugin/utils.rb:54:in `[]': no implicit conversion of String into Integer (TypeError)\n\tfrom /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-plugin/utils.rb:54:in `block in deep_merge'\n\tfrom /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-plugin/utils.rb:52:in `each'\n\tfrom /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-plugin/utils.rb:52:in `deep_merge'\n\tfrom /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-plugin/utils.rb:22:in `block in settings'\n\tfrom /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-plugin/utils.rb:22:in `each'\n\tfrom /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-plugin/utils.rb:22:in `reduce'\n\tfrom /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-plugin/utils.rb:22:in `settings'\n\tfrom /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:123:in `api_settings'\n\tfrom /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:131:in `api_request'\n\tfrom /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:179:in `stash_exists?'\n\tfrom /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:191:in `block (2 levels) in filter_silenced'\n\tfrom /opt/sensu/embedded/lib/ruby/2.3.0/timeout.rb:91:in `block in timeout'\n\tfrom /opt/sensu/embedded/lib/ruby/2.3.0/timeout.rb:33:in `block in catch'\n\tfrom /opt/sensu/embedded/lib/ruby/2.3.0/timeout.rb:33:in `catch'\n\tfrom /opt/sensu/embedded/lib/ruby/2.3.0/timeout.rb:33:in `catch'\n\tfrom /opt/sensu/embedded/lib/ruby/2.3.0/timeout.rb:106:in `timeout'\n\tfrom /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:190:in `block in filter_silenced'\n\tfrom /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:188:in `each'\n\tfrom /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:188:in `filter_silenced'\n\tfrom /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:36:in `filter'\n\tfrom /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:80:in `block in <class:Handler>'\nwarning: event filtering in sensu-plugin is deprecated, see http:// bit.ly/sensu-plugin\n"]}

Мы использовали следующий скрипт как remediator.rb https://github.com/sensu-plugins/sensu-plugins-sensu/blob/master/bin/handler-sensu.rb

Проверка выполняется правильно, и мы получаем ответ от клиентского сервера sensu, но похоже, что remediator.rb не может его обработать.

Вот конфигурация:

remediator.json
{
  "handlers": {
    "remediator": {
      "command": "/etc/sensu/plugins/remediator.rb",
      "type": "pipe",
      "timeout": 10,
      "severities": ["critical", "warning", "unknown"]
    }
  }
}

Сделано это максимально простым для проверки:

/etc/sensu/conf.d/checks
{
  "checks": {
    "seyren_check": {
      "command": "/opt/sensu/embedded/bin/ruby /etc/sensu/plugins/check-procs.rb -p unexisent_process",
      "interval": 30,
      "subscribers": ["trep"],
      "handlers": ["remediator","default","file"],
      "occurrences": 1,
      "refresh": 10,
      "remediation": {
        "first_remediation": {
          "occurrences": [1, 2],
          "severities": [1]
        },
        "medium_remediation": {
          "occurrences": ["3-10"],
          "severities": [1]
        },
        "heavy_remediation": {
          "occurrences": ["1+"],
          "severities": [2]
        }
      }
    },
    "first_remediation": {
      "command": "touch /etc/sensu/plugins/test_lr",
      "subscribers": ["my.machine.local"],
      "handlers": ["default"],
      "interval": 10,
      "publish": false
    },
    "medium_remediation": {
      "command": "touch /etc/sensu/plugins/test_mr",
      "subscribers": ["my.machine.local"],
      "handlers": ["default"],
      "interval": 10,
      "publish": false
    },
    "heavy_remediation": {
      "command": "touch /etc/sensu/plugins/test_hr",
      "subscribers": ["my.machine.local"],
      "handlers": ["default"],
      "interval": 10,
      "publish": false
    }
  }
}

person user3292147    schedule 06.04.2017    source источник
comment
Можете ли вы включить какие-либо связанные конфигурации, чтобы помочь определить, в чем может заключаться проблема? Несмотря на то, что Sensu является несколько простой системой, для работы исправления требуется немного проводки, и легко сделать ошибку (я также реализовал включенный вами обработчик remediation).   -  person vase    schedule 11.04.2017
comment
Привет, я обновил дополнительную информацию в вопросе. @vase, не могли бы вы сказать мне, какую версию sensu вы используете? потому что я блуждаю, некоторые функции, которые remediation используют, устарели.   -  person user3292147    schedule 20.04.2017
comment
Это было довольно давно, и по большей части я теряю память - я работал где-то около 0.18.X. Я полагаю, что ваша проблема заключается в том, что последние поля first_remediation, medium_remediation и heavy_remediation имеют неправильную область действия. Они привязаны к полному объекту checks, но их область действия должна быть специфичной для проверки, к которой они применяются (в этом случае они должны быть на один уровень глубже), прямо рядом с ключом remediation внутри seyren_check.   -  person vase    schedule 09.05.2017


Ответы (1)


  • Здесь мы предпочитаем использовать инструмент CM под названием Ansible. Вот обработчик и основная идея:

#

 #! /usr/bin/env ruby

require 'sensu-handler'
    require 'json'

    class Ansible < Sensu::Handler
  def handle
    ansible = settings['ansible']['command'] || 'ansible-playbook'
    playbook = settings['ansible']['playbook'] || nil
    extra_vars = JSON.generate(@event)

    unless @event['check']['ansible'].nil?
      playbook = @event['check']['ansible']['playbook'] || playbook
    end

    command = ansible.to_s playbook.to_s
    output = `#{command}`

    if $?.exitstatus > 0
      puts output
      exit 1
    else
      puts "SUCCESS: #{command}"
    end
  end
end
  • Затем вы создаете конфигурацию обработчика:

    { "handlers": { "ansible": { "type": "pipe", "command": "/etc/sensu/handlers/handler-ansible.rb" } } }

И Настройки для сборника исправлений:

cat conf.d/handler/config_ansible.json 
{
    "ansible": {
        "command": "/etc/sensu/scripts/provision",
        "playbook": " --tags checksum"
    }
}
  • И в вашей конфигурации проверки добавьте имя обработчика исправления:

    { ...
    

    «обработчики»: [«электронная почта», «анзибл», «логсташ»] .... }

  • Где команда здесь:

    ssh root@my_ansible_server.comp.com -o BatchMode=yes -o "StrictHostKeyChecking no" -o ConnectTimeout=10 ansible-playbook -i /etc/ansible/generic.hosts /etc/ansible/remediation.yaml ${@}

person Hanynowsky    schedule 02.06.2017