Как мне добавить отношения между двумя чарами для передачи информации между ними?

Я новичок в Джуджу. До сих пор я создавал и начинал развертывание одного приложения и отдельно его.

Но теперь из приложения мне нужно добавить связь с обаянием сервера и получить подробности из обаяния сервера.

Детали, такие как публичный адрес и частный адрес. Я исследовал, как добавить отношения между двумя чарами. Но мне не ясно, как добавить отношения и получить детали. Я только знаю, что хочу добавить какой-нибудь параметр в файл metadata.yaml.

Может кто-нибудь сказать мне, как добавить отношения и получить подробности из очарования сервера? По сути, мне нужно предоставить IP-адрес по очарованию сервера, и после добавления отношения из очарования приложения необходимо прочитать этот IP-адрес.

5
задан 30 July 2014 в 18:30

1 ответ

Как я определяю отношения?

Так, для определения отношений между двумя очарованием, Вы должны сначала, поскольку Вы сослались на, определите отношение в каждом, очаровывает metadata.yaml файл. Так как Вы определили сервер/роль клиента, я собираюсь придерживаться этого в своих примерах ниже с foo-server и foo-client очарование. Так как это вероятно сервер, обеспечивающий большинству данных клиенту, их metadata.yaml файлы выглядели бы как таковыми:

сервер нечто

name: foo-server
description: Something more than this
provides:
  server:
    interface: foo

клиент нечто

name: foo-client
description: Something more than this
requires:
  backend:
    interface: foo

Амулет имеет два основных типа отношения. Обеспечивает и Требует. В этом случае очарование сервера обеспечивает "нечто" как интерфейс. Клиентское очарование требует, чтобы интерфейс "нечто" работал. Это обеспечивает/требует, позволяет амулету знать, какое очарование может говорить который другое очарование.

Интерфейс является произвольным именем, в этом нечто случая, но мог быть чем-либо. Существует большой список уже определенных интерфейсов, таких как: mysql, http, mongodb, и т.д. Если бы Ваш сервис обеспечивает один из этих существующих интерфейсов, Вы хотели бы рассмотреть реализацию его. Если не не стесняются создавать новый.

Как я получаю/отправляю данные?

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

Так, у нас есть два очарования, foo-server и foo-client. foo-server предоставляет отношению "сервера" с интерфейсом нечто. foo-client требует отношения "бэкенда" с интерфейсом нечто. Рычаги отношения называют на основе имени отношения (не имя интерфейса). Их можно было и назвать сервером, но проиллюстрировать, что амулет соответствует в интерфейсе и не отношении, я сделал foo-client имя отношения "бэкенд".

foo-server/hooks/server-relation-joined

#!/bin/bash

set -eux

relation-set hostname=`unit-get private-address`

Это - очень простой пример, где мы создаем названный ключ отношения hostname и устанавливание значения, с помощью unit-get команда, к частно-адресной из единицы очарование развертывается на. Этот адрес будет варьироваться от поставщика поставщику, но это всегда будет достижимо в среде амулета. Можно установить несколько ключей путем добавления пространства между ключами, например:

relation-set hostname=`unit-get private-address` public-address=`unit-get public-address`

Это отправит два ключа, hostname и public-address к любому сервису это подключено с.

foo-client/hooks/backend-relation-changed

Заметьте различие в имени файла, это вызывает relation-changed рычаг вместо relation-joined. По-видимому, сервер просто предоставляет подробную информацию того, где он живет, таким образом, клиентское очарование должно знать, где тот адрес. Путем помещения этого в измененный на отношение рычаг каждый раз, когда данные по отношению обновляются, рычаг называют снова.

#!/bin/bash

set -eux

server_address=`relation-get hostname`

if [ -z "$server_address" ]; then
  juju-log "No data sent yet"
  exit 0
fi

# If you've gotten this far, you have a $server_address, configure as you see fit

Теперь, там немного более вовлечено в этот рычаг. Беря его линию за линией, первые три являются просто стандартным материалом. Это - очарование удара и set -eux есть ли, чтобы удостовериться, что рычаг ведет себя, как он должен. Использование следующей строки relation-get который считает данные отношения с соединения. Теперь, все в среде амулета организуется асинхронно. Таким образом, Вы никогда не на 100% уверены, что у Вас будут данные, когда Вы будете звонить relation-get. Это то, где if блок помогает разрешить это. Если не будет ничего в "$server_address", т.е. мы не получили возвращаемое значение, то рычаг будет простой выход. Однако это выходит с нулевым состоянием, таким образом, это не неожиданно возникнет как ошибка в амулете.

Я знаю, что это кажется интуитивным счетчиком, у нас технически есть проблема, потому что у нас нет данных. Да, но, это больше вроде, у "Нас нет данных, еще". Путем выхода из нуля, когда-то соответствующий сервис на самом деле устанавливает значение, он инициирует relation-changed сцепитесь снова, и мы сможем считать значение. Это считают примером защиты idempotency, которые крайне важны, поскольку Вы пишете рычаги.

6
ответ дан 30 July 2014 в 18:30

Другие вопросы по тегам:

Похожие вопросы: