【问题标题】:Variable reuse in YAML, variable within variableYAML中的变量重用,变量中的变量
【发布时间】:2018-01-07 02:31:00
【问题描述】:

我正在寻找一种方法来重用 YAML 列表中定义的变量,我有一个包含以下示例条目的 YAML 列表:

workstreams:
  - name: tigers
    service_workstream: tigers-svc
    virtual_user:
      - {name: inbound-tigers, pass: '123', access: inbound, env: app1}
      - {name: outbound-tigers, pass: '123', access: outbound, env: app1}
    email: tigers@my-fqdn.com
    mount_dir: /mnt/tigers
    app_config_dir: /opt/tigers

使用上面的示例,我想重用一个定义的值,例如 tigers。理想的解决方案是这样的:

workstreams:
  - name: tigers
    service_workstream: "{{ vars['name'] }}-svc"
    virtual_user:
      - {name: "inbound-{{ vars['name'] }}", pass: '123', access: inbound, env: app1}
      - {name: "outbound-{{ vars['name'] }}", pass: '123', access: outbound, env: app1}
    email: "{{ vars['name'] }}@my-fqdn.com"
    mount_dir: "/mnt/{{ vars['name'] }}"
    app_config_dir: "/opt/{{ vars['name'] }}"

关于如何在 YAML 中执行此操作的任何要点?

【问题讨论】:

  • 我总是想知道在这种情况下vars 将如何与作为列表元素的映射链接,其中列表是(顶层)映射中的值。如果那是workstreams[0]['name'] 甚至workstream.0.name 我可以想象它可以做到(虽然不在YAML规范中),但使用vars,没办法。
  • @Anthon:我曾想过在即将到来的 YAML 1.3 中做类似的事情,但其他事情目前对我们来说更重要。我的想法是将它与别名耦合,因此您需要像 &root 这样的根级别的锚点,然后可以执行 *root.workstreams.1.name (我喜欢基于 1 的索引)。

标签: yaml


【解决方案1】:

你可以这样做:

workstreams:
  - name: &name tigers          # the scalar "tigers" with an anchor &name
    service_workstream: *name   # alias, references the anchored scalar above

但是,您可以在 YAML 1.2 中进行字符串连接或类似的操作。它不能对输入数据进行任何转换。别名实际上是对持有相应锚点的节点的引用,它不是变量。

相当多的使用 YAML 的软件为该问题提供了非 YAML 解决方案,例如,使用 Jinja 或诸如此类的预处理 YAML 文件。根据具体情况,这可能对您来说是一个可行的解决方案,也可能不是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2021-08-21
    • 2021-02-03
    • 2020-04-21
    • 1970-01-01
    • 2015-03-29
    • 2021-07-02
    相关资源
    最近更新 更多