如何添加两个魅力之间的关系以在它们之间传递信息?

Saj*_*ara 6 juju

我是juju的新手。到目前为止,我已经创建并开始分别部署一个应用程序魅力和切断魅力。

但是现在从应用程序中,我需要添加与服务器魅力的关系并从服务器魅力中获取详细信息。

公共地址和私人地址等详细信息。我研究了如何添加两个魅力之间的关系。但是我不清楚如何添加关系和获取详细信息。我只知道我想在 metadata.yaml 文件中添加一些参数。

谁能告诉我如何添加关系并从服务器魅力中获取详细信息?基本上我需要通过服务器魅力提供 IP 地址,并且在从应用程序魅力添加关系后需要读取这个 IP 地址。

Mar*_*ppi 6

如何定义关系?

因此,为了定义两个魅力之间的关系,您必须首先,正如您所提到的,在每个魅力metadata.yaml文件中定义关系。由于您已经定义了服务器/客户端角色,因此我将在下面的示例中使用foo-serverfoo-client魅力坚持这一点。因为它是有可能的服务器提供的大部分数据到客户自己的metadata.yaml文件看起来可能像这样:

foo-server

name: foo-server
description: Something more than this
provides:
  server:
    interface: foo
Run Code Online (Sandbox Code Playgroud)

客户端

name: foo-client
description: Something more than this
requires:
  backend:
    interface: foo
Run Code Online (Sandbox Code Playgroud)

Juju 有两种主要的关系类型。提供和要求。在这种情况下,服务器魅力提供“foo”作为接口。客户端魅力需要“foo”接口来操作。这提供/要求让 juju 知道哪些魅力可以与其他魅力交谈。

接口是一个任意名称,在本例中为 foo,但可以是任何名称。有大量已定义的接口,例如:mysql、http、mongodb 等。如果您的服务提供这些现有接口之一,您会考虑实现它。如果不能随意创建一个新的。

如何获取/发送数据?

定义元数据后,您需要创建一些新挂钩,挂钩名称在链接文档中定义,但由于您只是发送地址信息,我们将保留一个简单的 bash 实现示例每个钩子。

所以,我们有两个魅力,foo-serverfoo-clientfoo-server提供与 foo 接口的“服务器”关系。foo-client需要与 foo 接口的“后端”关系。关系挂钩基于关系名称(而不是接口名称)命名。这些都可以称为服务器,但为了说明 juju 匹配接口而不是关系,我将foo-client关系名称设为“后端”。

foo-server/hooks/server-relation-joined

#!/bin/bash

set -eux

relation-set hostname=`unit-get private-address`
Run Code Online (Sandbox Code Playgroud)

这是一个非常基本的示例,我们正在创建一个名为的关系键,hostname并使用unit-get命令将值设置为部署魅力所在单元的私有地址。该地址因提供商而异,但在 juju 环境中始终可以访问。您可以通过在键之间添加空格来设置多个键,例如:

relation-set hostname=`unit-get private-address` public-address=`unit-get public-address`
Run Code Online (Sandbox Code Playgroud)

这将发送两个密钥,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
Run Code Online (Sandbox Code Playgroud)

现在,这个钩子有更多的参与。一行一行,前三个只是标准的东西。这是一个 bash 魅力,set -eux可以确保钩子的行为正常。下一行使用relation-getwhich 将从连接中读取关系数据。现在,juju 环境中的所有内容都是异步编排的。因此,您永远无法 100% 确定在调用relation-get. 这是if块帮助解决这个问题的地方。如果“$server_address”中没有任何内容,即我们没有得到返回值,钩子将简单退出。但是,它以零状态退出,因此它不会在 juju 中作为错误出现。

我知道这似乎违反直觉,我们在技术上有问题,因为我们没有数据。是的,但是,更像是“我们还没有数据”。通过退出零,一旦相应的服务实际设置了该值,它将relation-changed再次触发钩子,我们将能够读取该值。这被认为是幂等保护的一个例子,这在您编写钩子时至关重要。