我该如何定义一段关系?

我该如何定义一段关系?

我是 juju 的新手。到目前为止,我已经分别创建并开始部署一个应用程序 charm 和服务器 charm。

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

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

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

答案1

我该如何定义一段关系?

因此,为了定义两个 charms 之间的关系,您必须首先(如您所提到的)在每个 charms 文件中定义关系。由于您已经定义了服务器/客户端角色,因此我将在下面的例子中使用和charmsmetadata.yaml来坚持这一点。由于服务器很可能是foo-serverfoo-client提供大多数数据客户它们的 metadata.yaml 文件如下所示:

foo 服务器

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

foo-客户端

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

Juju 有两种主要关系类型。提供和需要。在本例中,服务器魅力是提供“foo” 作为接口。客户端 charm需要要操作的“foo”接口。这提供/要求让 juju 知道哪些 charms 可以与哪些其他 charms 对话。

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

我如何获取/发送数据?

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

因此,我们有两个 charm,foo-server并且foo-clientfoo-server提供与 foo 接口的“服务器”关系。foo-client需要与 foo 接口的“后端”关系。关系钩子基于关系名称(而不是接口名称)命名。它们都可以称为服务器,但为了说明 juju 基于接口而不是关系进行匹配,我将关系名称设为foo-client“后端”。

foo-服务器/钩子/服务器关系加入

#!/bin/bash

set -eux

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

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

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

这将发送两个密钥hostname以及public-address它所连接的任何服务。

foo-client/hooks/后端关系已更改

注意文件名的不同,这是调用relation-changed钩子而不是relation-joined。据推测,服务器只是提供其所在位置的详细信息,因此客户端 charm 需要知道该地址在哪里。通过将其放入关系更改的钩子中,每次更新关系上的数据时都会再次调用钩子。

#!/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

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

我知道这似乎违反直觉,从技术上讲,我们遇到了问题,因为我们没有数据。是的,但是,这更像是“我们还没有数据”。通过退出零,一旦相应的服务实际设置了值,它将relation-changed再次触发钩子,我们将能够读取该值。这被认为是幂等性守卫这对于你写钩子来说至关重要。

相关内容