智能边缘BIE

    存储卷预定义宏

    什么是预定义宏

    预定义宏可以在我们配置存储卷文件时(仅限官方提供模块),不必显示的填写配置文件内容,可以写入预定义宏在配置加载时替换为环境变量。

    如何使用预定义宏

    我们可以写入预定义宏,这样可以把宏替换为容器系统环境变量中值;

    例如: 存在环境变量 BAETYL=0.1.6 在配置文件中写入

    {{.BAETYL}}

    官方模块配置加载后会自动解析为

    0.1.6

    注意:宏格式必须为 {{.}} 形式

    典型案例

    下面我们将用两个实际的例子来展示预定义宏的用法。

    案例1:自定义环境变量动态填充预定义宏

    Step1: 创建一个带有预定义宏的存储卷

    以为baetyl-hub模块创建配置存储卷为例,如下图所示:

    image.png

    编辑 service.yml 配置文件,在配置文件当中使用预定义宏 {{.DEVICE_PUB}},如下所示:

    listen:
      - tcp://0.0.0.0:1883
    principals:
      - username: test
        password: hahaha
        permissions:
          - action: 'pub'
            permit: ['{{.DEVICE_PUB}}']
          - action: 'sub'
            permit: ['#']
    subscriptions:
      - source:
          topic: 't'
        target:
          topic: 't/topic'
    logger:
      path: var/log/baetyl/service.log
      level: "debug"

    {{.DEVICE_PUB}} 是预定于宏,配置文件加载后,会动态被填充相应的值

    Step2: 创建应用模版

    创建一个应用模版,然后在应用模板当中添加一个baetyl-hub模块,并设置环境变量 DEVICE_PUB:ABC ,如下图所示:

    image.png

    环境变量 DEVICE_PUB:ABC 当中的KEY值 ABC 将自动被注入到预定义宏{{.DEVICE_PUB}}当中。

    挂载配置存储卷,如下图所示:

    image.png

    Step3: 基于应用模版创建核心

    在创建核心的时候,选择step2当中创建的应用模板,如下图所示:

    image.png

    创建完成以后,将核心部署到边缘设备,详细步骤可以参考快速入门

    Step4: 验证预定义配置是否生效

    使用MQTT.fx 连接到本地 hub,MQTT.fx配置如下图所示:

    image.png

    尝试向主题 t 发送消息,因为没有权限,所以连接断开,符合预期,如下图所示:

    image.png

    尝试向主题 ABC 发送消息,发送成功,符合预期,如下图所示:

    image.png

    image.png

    案例2:使用系统环境变量 BAETYL_HOST_ID

    使用 BAETYL_HOST_ID 作为日志文件名

    BAETYL_HOST_ID 环境变量无需用户配置,是由 百度开放边缘框架(自0.1.6版本以后的官方模块) 在启动容器时,自动注入的环境变量,他在每台设备中的值不同,可以做到同一应用模版和存储卷配置,在不同核心设备上表示不同的效果。

    在 Mac 下,该变量取值为 kern.uuid;更多系统下的取值,请参考 https://github.com/shirou/gopsutil 对于 HostID 的设定。

    Step1: 创建带有预定义宏的存储卷:

    image.png

    并且填写配置文件,写入预定义宏:

    listen:
      - tcp://0.0.0.0:1883
    principals:
      - username: test
        password: hahaha
        permissions:
          - action: 'pub'
            permit: ['#']
          - action: 'sub'
            permit: ['#']
    subscriptions:
      - source:
          topic: 't'
        target:
          topic: 't/topic'
    logger:
      path: var/log/baetyl/{{.BAETYL_HOST_ID}}.log
      level: "debug"

    请注意 {{.BAETYL_HOST_ID}} 则是输入的预定义宏,配置文件加载后,会把它替换成对应值;

    我们将日志文件的名字设置为预定义宏,所以我们还需要创建一个空目录存储卷,用来查看日志。

    Step2: 创建一个应用模版, 添加一个 hub 服务:

    image.png

    请注意,我们不需要输入 环境变量 BAETYL_HOST_ID 系统会为我们添加;

    挂载存储卷,并保存:

    image.png

    最终结果:

    image.png

    Step3: 基于模版创建核心(您也可以直接在核心中配置):

    选择刚才创建的应用模版;

    image.png

    创建完成,下载 V1 版本配置,并启动;

    Step4: 验证预定义配置是否生效:

    观察 hub 模块的日志文件名称,发现配置生效。

    image.png

    使用 BAETYL_HOST_ID 作为MQTT ClientID

    我们在使用 remote mqtt 模块的时候,如果您有多个核心需要接入同一个 remote hub,在共用一套配置时,他们的 clientId 会是相同的,这会出现互踢的情况,此时,您可以使用预定义宏 {{.BAETYL_HOST_ID}} 作为 clientId,如下:

    hub:
      address: tcp://localhub:1883
      username: test
      password: hahaha
    remotes:
      - name: iothub
        address: 'ssl://xxxxxxxxxxxxxxx'
        clientid: {{.BAETYL_HOST_ID}}
        username: xxxxxxx/test
        ca: var/db/baetyl/cert/ca.pem
        cert: var/db/baetyl/cert/client.pem
        key: var/db/baetyl/cert/client.key
    rules:
      - hub:
          subscriptions:
            - topic: t
        remote:
          name: iothub
          subscriptions:
            - topic: t/remote
              qos: 1
    logger:
      path: var/log/baetyl/service.log
      level: "debug"

    这样每一台机器上的核心,接入 remote hub 的 clientId 都不相同。

    上一篇
    存储卷类型
    下一篇
    如何在自定义存储卷上传第三方依赖源码并调用