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

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

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

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

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

我如何定义关系?

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

FOO服务器

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

富客户端

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

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

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

我如何获取/发送数据?

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

所以,我们有两个魅力, foo-serverfoo-clientfoo-server提供与foo接口的“服务器”关系。 foo-client需要与foo接口的“后端”关系。 关系挂钩基于relation-name(不是接口名称)命名。 这些都可以被称为服务器,但为了说明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` 

这将向其连接的任何服务发送两个密钥, hostnamepublic-address

FOO的客户机/钩/后端-关系改变的

注意文件名的不同,这是调用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 

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

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