Я новичок в Джуджу. До сих пор я создавал и начинал развертывание одного приложения и отдельно его.
Но теперь из приложения мне нужно добавить связь с обаянием сервера и получить подробности из обаяния сервера.
Детали, такие как публичный адрес и частный адрес. Я исследовал, как добавить отношения между двумя чарами. Но мне не ясно, как добавить отношения и получить детали. Я только знаю, что хочу добавить какой-нибудь параметр в файл metadata.yaml.
Может кто-нибудь сказать мне, как добавить отношения и получить подробности из очарования сервера? По сути, мне нужно предоставить IP-адрес по очарованию сервера, и после добавления отношения из очарования приложения необходимо прочитать этот IP-адрес.
Так, для определения отношений между двумя очарованием, Вы должны сначала, поскольку Вы сослались на, определите отношение в каждом, очаровывает 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
имя отношения "бэкенд".
#!/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
к любому сервису это подключено с.
Заметьте различие в имени файла, это вызывает 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, которые крайне важны, поскольку Вы пишете рычаги.