Рубрики
Uncategorized

Runbook: Ruby DSL для постепенной системы автоматизации

В Braintree нам нравится писать инструменты для автоматизации нашей работы. Наш последний инструмент — это Runbook, Ruby DSL для … Помечено Ruby, DevOps, производительностью, SRE.

Runbook (2 часть серии)

В Braintree нам нравится писать инструменты для автоматизации нашей работы. Наш последний инструмент — Runbook , Ruby DSL для постепенного автоматизации системных операций.

Я знаю, что ты думаешь: Зачем строить еще один инструмент для автоматизации работы инженера? У нас уже есть сценарии Bash!

Во-первых, любой, кто пытался написать на петлю в Bash, будет признать, что это не интуитивно понятно (я должен посмотреть на это каждый время!). Во-вторых, даже при скриптах решений общих операций по техническому обслуживанию, часто бывают установка, разрыва и шаги проверки, которые необходимы для обеспечения успешной работы операции. Сколько раз вы столкнулись с проблемами, забывающими, чтобы выполнить шаг установки или очистки, который требуется для вашего сценария обслуживания? Сколько раз вы забыли убедиться, что операция преуспела?

Мы часто можем смягчить такие проблемы с хорошей документацией. Проблема с документацией по программному обеспечению, как мы знаем, состоит в том, что он может устареть со временем, если сопровождающие пренебрегают обновлять его.

Как часто вы писали операцию по обслуживанию только для того, чтобы она устарела и сломала шесть месяцев спустя? Неизбежно, вы разбите редактор и выполняете операцию с сценарием, чтобы восстановить из неисправного состояния.

RunBook обращается к этим типам вопросов, предоставляя структуру, которая тесно пары документации и код для операции. Это также позволяет вам постепенно автоматизировать ваши операции, находя правильный баланс между полной автоматизацией и человеческим участием.

Философия Runbook сильно выровнена с Дэн-Сэммоном Делать, ничего не сценарию а также Athul Gawande’s Контрольный манифест . Он предназначен для минимизации Трудиться Отказ

RunBook не предназначен для замены дополнительных решений для автоматизации специального назначения, таких как решения для управления конфигурами (кукольный, шеф-повар, Anisible, соль), решения развертывания (CAPISTRANO, KUBERNETES, DataDog), мониторинг (Nagios, DataDog) или локальная команда выполнения (Райки задачи, сделайте). Вместо этого RunBook лучше всего использовать в качестве клея, когда нужно выполнить задачу, которая порезает эти домены.

Простая рубанка

Руковезон описывает список шагов, необходимых для выполнения операции.

# restart_nginx.rb

Runbook.book "Restart Nginx" do
  description <<-DESC
This is a simple runbook to restart nginx
  DESC

  section "Restart Nginx" do
    step "Stop Nginx"
    step "Wait for requests to drain"
    step "Start Nginx"
  end
end

Он может быть скомпилирован и используется для генерации контрольного списка разметки или быть интерактивно выполненным.

# Restart Nginx

This is a simple runbook to restart nginx

## 1. Restart Nginx

1. [] Stop Nginx

2. [] Wait for requests to drain

3. [] Start Nginx

Добавление автоматизации

Переходя мимо этого начального наброска, можно начать создавать автоматизацию в их Runbook.

# restart_nginx.rb

Runbook.book "Restart Nginx" do
  description <<-DESC
This is a simple runbook to restart nginx and
verify it starts successfully
  DESC

  section "Restart Nginx" do
    server "app01.prod"
    user "root"

    step "Stop Nginx" do
      note "Stopping Nginx..."
      command "service nginx stop"
      assert %q{service nginx status | grep "not running"}
    end

    step { wait 30 }

    step "Start Nginx" do
      note "Starting Nginx..."
      command "service nginx start"
      assert %q{service nginx status | grep "is running"}
      confirm "Nginx is taking traffic?"
      notice "Make sure to report why you restarted nginx"
    end
  end
end

Обратите внимание, что этот розыгрыш включает в себя шаг Подтвердить "nginx принимает трафик?" . Вы можете легко отложить шаги сценариев, которые сложнее автоматизировать, делегируя этот шаг к человеку, выполняющей RunBook.

Функции

Некоторые функции Runbook включают в себя:

SSH Integration

RunBook интегрируется с SSH, используя Сшкит Для обеспечения поддержки выполнения команд на удаленных серверах, загрузке и загружающих файлах и загрузке вывода от удаленных выполненных команд. Вы можете контролировать стратегию параллелизации для выполнения, выполнения параллельно, серийно или в группах.

Runbook.book "Restart Nginx" do
  section "Restart Services" do
    servers (0..50).map { |n| "app#{n.to_s.rjust(2, "0")}.prod" }
    parallelization(strategy: :groups, limit: 5, wait: 2)

    step "Restart services" do
      command "service nginx restart" 
    end
  end
end

Вышеуказанный пример выполняет Сервис Nginx перезапустите через приложение {01 .. 50}. Lod на пять серверов за раз, Ожидание 2 секунды между каждым исполнением.

Динамический контрольный поток

Мы разработали Runbook’s контрольный поток быть динамичным; В любой момент вы можете пропустить шаги, перейти на любой шаг (даже предыдущий шаг) или выйти.

RunBook сохраняет свое состояние между каждым шагом RunBook, и он может перезапустить, откуда оно оставлено, если произошла ошибка при выполнении Runnober. На самом деле, вы можете возобновить остановленную ручету в любой момент в его исполнении.

NOOP и AUTO MEDES

RunBook предоставляет как NOOP, так и автоматический режим. Режим NOOP позволяет проверить операции, которые ваш ронкт будет работать, прежде чем выполнить его. Автоматический режим выполнит ваш ронкт, требуя от человеческого взаимодействия. Любые подсказки, которые вы добавили в свой Runbook, будут использовать при условии предоставленные значения по умолчанию, или выполнение будет немедленно выключено, если бы предсказывайте существуют без по умолчанию.

Выполнение Крючки жизненного цикла

RunBook предоставляет поддержку раньше, вокруг, и после выполнения крючков. Вы можете изменить и увеличить свое поведение RunBook, подключив к выполнению объектов и заявлений в вашем Runnowbook. Крючки могут быть использованы для обеспечения богатого набора поведения, такого как время исполнения шагов Runnober или Runbook в целом, отслеживая частоту выполнения RunBook, и уведомление о расслаивании, когда Runbook завершится.

Runbook::Runs::SSHKit.register_hook(
  :notify_slack_of_execution_time,
  :around,
  Runbook::Entities::Book
) do |object, metadata, block|
  start = Time.now
  block.call(object, metadata)
  duration = Time.now - start
  unless metadata[:noop]
    message = "Runbook #{object.title}: took #{duration} seconds to execute!"
    notify_slack(message)
  end
end

Первоклассная поддержка TMUX

В Braintree мы живем на устойчивой диеты Vim и Tmux. . Следовательно, RunBook предоставляет первоклассную поддержку для выполнения команд в рамках TMUX. При указании вашего Runbook вы можете определить макет TMUX. Этот гибкий и интуитивно понятный интерфейс позволяет отправлять команды на панели по имени.

Выполнение команд в отдельных панелях идеально подходит для мониторинга, команд, которые требуют взаимодействия пользователя или команды, которые склонны к ошибкам. Затем вы можете взаимодействовать с командой напрямую, устранение неполадок и разрешения проблем, прежде чем продолжить Runnoblic.

Runbook.book "Restart Nginx" do
  layout [[
    [{name: :top_left, runbook_pane: true}, :top_right],
    :middle,
    {name: :bottom, directory: "/var/log", command: "tail -Fn 100 nginx.log"},
  ]]

  section "Setup monitoring" do
    step do
      tmux_command "watch 'service nginx status'", :top_right
      tmux_command "vim /etc/nginx/nginx.conf", :middle   
    end
  end
end

Руковены вспоминают свои макеты TMUX между выполнениями. Если Runbook останавливается неожиданно, он будет подключаться к существующему расположению TMUX при возобновлении до тех пор, пока панели TMUX не были изменены. Кроме того, Runbooks предлагает автоматически закрывать свои панели TMUX, когда бегантский заканчивается выполнение.

Рубиные команды

Runbook предоставляет Ruby_Command Заявление для динамически определить операторы Runbook и их аргументы. Например, вы можете ударить конечную точку JSON, чтобы получить список серверов, а затем выполнить команду на каждом из этих серверов. Поскольку вы работаете в Ruby, у вас есть доступ ко всем возможностям разборки и обработки, которые он обеспечивает.

require 'json'

Runbook.book "Restart Old Services" do
  section "Restart week-old services" do  
    step do
      server "monitor01.prod"

      capture "curl localhost:9200/host_ages.json",  into: :host_ages

      ruby_command do |rb_cmd, metadata|
        one_week_ago = 1.week.ago
        old_hosts = JSON.parse(host_ages).select { |host| host["started"] < one_week_ago }
        old_host_names = old_hosts.map { |host| host["name"] }
        old_host_names.each do |name|
          command "shutdown -r now", ssh_config: {servers: [name], user: "root"}
        end
      end  
    end
  end
end

Генераторы

RunBook предоставляет генераторы, похожие на рельсы, для генерации Runbooks, расширений Runbook и Runbook, ориентированные на проекты. Вы даже можете определить свои собственные генераторы для включения пользовательских настроек в команде в ваших сгенерированных Runbooks.

Адаптивность

RunBook предназначен для беспрепятственного интеграции в существующую инфраструктуру. Он может быть использован в качестве библиотеки Ruby, инструмент командной строки или для создания самоиползнимых руганков. Runbook придерживается универсальных интерфейсов, таких как командная строка и SSH. Руководства могут быть вызваны через задания CRON и интегрированы в контейнеры докеров.

Кроме того, Runbook расширяется, поэтому вы можете увеличить DSL со своими собственными операторами и функциональными возможностями. Ниже пример псевдонимов Раздел к S в Книга DSL.

module MyRunbook::Extensions
  module Aliases
    module DSL
      def s(title, &block)
        section(title, &block)
      end
    end
  end

  Runbook::Entities::Book::DSL.prepend(Aliases::DSL)
end

Эта гибкость позволяет адаптировать RunBook для удовлетворения любого случая использования.

Проверьте это

В Braintree мы используем Runbook для автоматизации нашего приложения Preflight Checlights, PlayBooks на вызове, операциям обслуживания системы, развертывание SDK и многое другое. Мы обнаружили, что это способно способствовать оптимизации производственных операций, уменьшая человеческую ошибку и увеличивая общее качество жизни.

Проверить Runbook на Github Для получения дополнительной информации о том, как вы можете использовать RunBook для оптимизации производственных операций и увеличить счастье разработчика!

Этот пост был первоначально опубликован на Средняя .

Runbook (2 часть серии)

Оригинал: «https://dev.to/pblesi/runbook-a-ruby-dsl-for-gradual-system-automation-232l»