пʼятниця, 25 січня 2013 р.

Charms

Данная статья рассматривает внутреннюю структуру charms, с помощью которых juju и создаёт лёгкость в развёртывании служб.

Если Juju - это магия, помогающая людям в жизни, то Charms - это чары, с помощью которых и делается магия.

Charms - это набор файлов, которые определяют как интегрировать данную службу (сервис) и как ей реагировать на события в распределённых средах.

Данная статья описывает определения charms, включая метаданные и хуки (hooks). Так же описываются имеющиеся ресурсы для хуков в juju окружении (environment).

Файл метаданных metadata.yaml.

Файл metadata.yaml в корне папки данной charm описывает charm. Поддерживаются следующие поля:

  • name: имя charm. Имя charm может состоять их букв в нижнем регистре, цифр, тире. Имя должно обязательно начинаться с буквы и цифры не должны быть одни в отделённой секции тире.
  • summary: описание charm в одну строку.
  • maintainer: емайл мантейнера в стандарте RFC2822.
  • description: длинное описание charm'а и его возможностей.
  • provides: charm может указать какую службу он предоставит.
  • requires: charm может указать требуемые ему уже развёрнутые другие службы.
  • peers: отношения (relations) с другими сервисами могут устанавливаться в P2P стиле, вместо provides / require или клиент / сервер стиле. Когда charm развёрнут как служба, все машины с данной службой автоматически включаются в состав этого отношения.

Отношения в полях provides, requires и peers должны иметь следующий синтаксис:

  • Имя отношения - данное имя определяет создатель charm. Имя должно быть уникальным в пределах charm.
    Каждое отношение может иметь свои поля:
    • interface: тип отношения. Отношения будут установлены только со службой с таким же интерфейсом. Примеры, "http", "mysql", "backup-schedule".
    • limit: максимальное количество отношений. По умолчанию используется 1. Слово "none" убирает лимит для отношений вида provides и peers.
    • optional: требуется ли данное отношение для работы или нет.
    • scope: Контролирует как юнит с сервисом, который устанавливает отношение, взаимодействует через эту взаимосвязь.
      • global: значение по умолчанию. Когда отношения созданы между двумя службами, все юниты первого сервиса получают все события об юнитах второго сервиса.
      • container: взаимодействие ограничено данным контейнером.

Пример metadata.yaml

name: nagios
summary: Nagios monitoring service.
maintainer: Clint Byrum 
description: |
  Nagios is a monitoring and management system for hosts, services, and
  networks.
provides:
  website:
    interface: http
  mymonitors:
    interface: monitors
requires:
  legacy:
    interface: monitoring
  nagios:
    interface: juju-info
  monitors:
    interface: monitors

Хуки (Hooks)

Juju использует хуки для уведомления службы об различных изменениях. Каждый хук для charm представляет собой исполняемый файл в подкаталоге hooks/. Juju вызывает хук, основываясь на его имени, когда возникает одноимённое событие.

Хук можно писать на любом скриптовом или компилирующем языке программирования.
Все хуки опциональны.

Следующие хуки отвечают за жизненный цикл службы:

  • install: выполняется один раз при разворачивании службы. Сейчас данный хук используется, чтобы удовлетворить пакетные зависимости службы. В будущем juju будет использовать метаданные charm, чтобы указать требуемое.
    Пример из Drupal charm.
        #!/bin/bash
        set -eux # -x for verbose logging to juju debug-log
        juju-log "Installing drush,apache2,php via apt-get"
        apt-get -y install drush apache2 php5-gd libapache2-mod-php5 php5-cgi mysql-client-core-5.5
        a2enmod php5
        /etc/init.d/apache2 restart
        
  • config-changed: запускается один раз после установки и в ответ на изменение конфигурации, например juju set. Создание конфигурации службы происходит на этом этапе.
    Пример из puppet.
    #!/bin/sh
    set -ue
    external_puppetmaster=`config-get external-puppetmaster`
    if [ -n "$external_puppetmaster" ] ; then
        scripts/set-puppet-server $external_puppetmaster
        puppet --test || :
    fi
        
  • start: запускает нужные службы. Цель данного хука чтобы все нужные службы были запущены, так как далее они понадобятся для установки отношений (relations) между собой.
    Пример из charm Nagios.
    #!/bin/bash
    service nagios3 start || :
    service apache2 start || :
           
  • stop: останавливает службы. Если отношения существуют, то сначала вызовутся соответствующие хуки ДО вызова данного хука.
    Пример из charm Nagios.
    #!/bin/bash
    service nagios3 stop || :
    service apache2 stop || :
           

Следующие хуки вызываются когда происходят изменения в отношениях.

  • <Имя отношения>-relation-joined: вызывается каждый раз, когда происходит первое вступление в отношения.
    Пример из charm Nagios.
         #!/bin/bash
         if [ -n "$JUJU_RELATION_ID" ] ; then
             # single relation joined
             rels=$JUJU_RELATION_ID
         else
             # Refresh from upgrade or some other place
             rels=`relation-ids mymonitors`
         fi
         target_id=${JUJU_UNIT_NAME//\//-}
         for rel in $rels ; do
             relation-set -r $rel \
                 monitors="`cat monitors.yaml`" \
                 target-address=`unit-get private-address` \
                 target-id=$target_id
         done
         
  • <Имя отношения>-relation-changed: вызывается всякий раз при поступлении событий:
    • Удалённый юнит вступает в отношения. Сначала вызывается <Имя отношения>-relation-joined, потом <Имя отношения>-relation-changed.
    • Удалённый юнит изменяет настройки отношения.

    Для примера, балансировщик HAProxy должен знать информацию об обслуживаемых им веб-серверах, в том числе IP адрес. Веб-сервер может сообщить нужную информацию, используя -relation-changed.

  • <Имя отношения>-relation-departed: вызывается всякий раз при разрыве отношений. Например, сервис удалён, сервис упал, отношения между сервисами были удалены.
    Для примера, балансировщик HAProxy должен знать когда веб-сервера не доступны, чтобы обновить свою конфигурацию и не перенаправлять запросы людей на упавший веб-сервер.

Хук отображающий отношение к себе:

  • <Имя отношения>-relation-broken: вызывается когда другой хук не доступен. Для примера, HAProxy может изменить свою конфигурацию, если другой экземпляр HAProxy на другом сервере не доступен.

Хук окружение. Hook environment.

Хуки могут использовать или устанавливать переменные окружения:

  • $JUJU_UNIT_NAME имя локального юнита в формате <имя службы>/<номер юнита>. Типа myblog/3.
  • $JUJU_RELATION - имя данного хука. Это избыточно, но бывает необходимо командной строке, чтобы узнать текущий контекст.
  • $JUJU_REMOTE_UNIT - имя юнита, вызвавшего хук на исполнение.

Хук команды для работы с отношениями.

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

Команды

  • relation-ids - список идентификаторов установленных отношений.
  • relation-list - список всех юнитов, участвующих в установленном отношении. В данном списке не отображается тот юнит, на котором была вызвана команда. Для отношений provides и requires всегда возвращается 1.
  • relation-get - запрашивает настройки установленных отношений из юнитов служб. Эта команда читает переменную окружения $JUJU_RELATION_NAME.
    Примеры:
    Получить IP адрес удалённого юнита :
    relation-get ip

    Получить все настройки удалённого юнита :
    relation-get

    Получить информацию об третьем юните, обслуживающий Wordpress:
    relation-get port wordpress/3

    Получить информацию об третьем юните, обслуживающий Wordpress, в формате JSON:
    relation-get - wordpress/3
  • relation-set изменяет настройки установленных отношений
    Примеры:
    Изменить порт юнита на 8080
    relation-set port=8080

    Изменить две настройки за один раз
    relation-set dbname=wordpress dbpass="super_secure_password3"

    Изменить несколько настроек через JSON файл
    cat settings.json | relation-set

    Удалить настройки
    relation-set name=

Изменения в настройках отношений принимаются и фиксируются только если хук заканчивает свою работу с кодом выхода 0. Только такие выходы приводят к вызову хука <Имя отношения>-relation-changed. Такое поведение позволяет наладить взаимодействие между юнитами с запущенными службами.

Команды хуков для открытия и закрытия портов.

В процессе работы хукам может понадобиться открывать и закрывать порты. Они могут вызывать
open-port port[/protocol]
close-port port[/protocol]

Эти команды open-port и close-port вызываются немедленно и они не зависят от кода выхода самого хука.

Пример, есть charm Wordpress, который после установки и настройки нужного ему Apache, может опубликовать нужный порт open-port 80.

Удобно при запуске и остановке службы извещать межсетевой экран, что порт нужен open-port port или не нужен close-port port. Файрвол тогда может смело блокировать трафик по не нужному в данный момент порту.

Juju и Charm - магия облака

Полезные ссылки:
jujucharms.com/charms - Коллекция готовых charms.

Вернуться к оглавлению цикла статей о Juju.

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments