Данная статья рассматривает внутреннюю структуру charms, с помощью которых juju и создаёт лёгкость в развёртывании служб.
Если Juju - это магия, помогающая людям в жизни, то Charms - это чары, с помощью которых и делается магия.
Charms - это набор файлов, которые определяют как интегрировать данную службу (сервис) и как ей реагировать на события в распределённых средах.
Данная статья описывает определения charms, включая метаданные и хуки (hooks). Так же описываются имеющиеся ресурсы для хуков в juju окружении (environment).
Файл metadata.yaml в корне папки данной charm описывает charm. Поддерживаются следующие поля:
Отношения в полях provides, requires и peers должны иметь следующий синтаксис:
Пример metadata.yaml
name: nagios summary: Nagios monitoring service. maintainer: Clint Byrumdescription: | 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
Juju использует хуки для уведомления службы об различных изменениях. Каждый хук для charm представляет собой исполняемый файл в подкаталоге hooks/. Juju вызывает хук, основываясь на его имени, когда возникает одноимённое событие.
Хук можно писать на любом скриптовом или компилирующем языке программирования.
Все хуки опциональны.
Следующие хуки отвечают за жизненный цикл службы:
#!/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
#!/bin/sh
set -ue
external_puppetmaster=`config-get external-puppetmaster`
if [ -n "$external_puppetmaster" ] ; then
scripts/set-puppet-server $external_puppetmaster
puppet --test || :
fi
#!/bin/bash
service nagios3 start || :
service apache2 start || :
#!/bin/bash
service nagios3 stop || :
service apache2 stop || :
Следующие хуки вызываются когда происходят изменения в отношениях.
#!/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
Для примера, балансировщик HAProxy должен знать информацию об обслуживаемых им веб-серверах, в том числе IP адрес. Веб-сервер может сообщить нужную информацию, используя -relation-changed.
Хук отображающий отношение к себе:
Хуки могут использовать или устанавливать переменные окружения:
Хуки могут использовать набор команд, которые им предоставляет juju, помогающие в работе с отношениями. Эти команды позволяют хукам узнавать и менять состояние отношений между службами.
Команды
relation-get ip
relation-get
relation-get port wordpress/3
relation-get - wordpress/3
relation-set port=8080
relation-set dbname=wordpress dbpass="super_secure_password3"
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 - магия облака
Полезные ссылки:
Вернуться к оглавлению цикла статей о Juju.