【问题标题】:If condition possible in yaml file?如果 yaml 文件中可能存在条件?
【发布时间】:2019-01-15 07:06:37
【问题描述】:

我需要根据 if 条件再添加一个名称。如果如果来自另一个 .yml 文件的变量值为“是”,则在列表中添加一个新名称

我的 yaml 文件中有以下代码:

JsNames:
 - name: 'jquery.min.js'
 - name: 'script.js'

我需要根据 if 条件添加更多名称。如果来自另一个 .yml 文件的变量值为“yes”,则添加一个新名称,如下所示:

JsNames:
 - name: 'jquery.min.js'
 - name: 'script.js'
 - name: 'new.js'

这可能吗?

尝试了以下方法:

JsNames:
 - name: 'jquery.min.js'
 - name: 'script.js'
 - | # Test multiline yaml support
   if [[ "site.data.settings.requiredjs" == "yes" ]]; then
     name: 'new.js'
   fi

我需要根据 if 条件添加更多名称。如果来自另一个 .yml 文件的变量值为“yes”,则添加一个新名称,如下所示:

JsNames:
 - name: 'jquery.min.js'
 - name: 'script.js'
 - name: 'new.js'

【问题讨论】:

  • 不使用“仅”YAML。 YAML 在这方面类似于 HTML 或 JSON:see the YAML specification 是允许的。
  • 我建议您阅读 YAML(规范,yaml.org 网站)。 1) YAML 文件的推荐扩展名自 2006 年以来一直是 .yaml。 2) 您似乎误以为文字块样式标量由 YAML 解释。规范中没有任何内容甚至暗示这一点(您的程序所做的当然是另一回事)。 3)您似乎认为 YAML 有一些点符号来获取嵌套值。再次阅读它没有的规范。

标签: yaml


【解决方案1】:

作为对 Vaibhav 回复的补充:虽然 yml 本身并不支持 if 语句,但某些使用 yml 文件作为指令的应用程序可能能够解析 yml 中包含的 if 语句。 GitLab 是一个值得注意的例子。在 GitLab 的 CI/CD 中,.gitlab-ci.yml 文件可以配置为包含 if 语句,例如:

job:
  script: "echo Hello, Rules!"
  rules:
    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
      when: always
    - if: '$VAR =~ /pattern/'
      when: manual
    - when: on_success

这是来自https://docs.gitlab.com/ee/ci/yaml/#rules

有关详细信息,请参阅此答案:https://stackoverflow.com/a/55464100/10792235

【讨论】:

  • yml 文件中的 bash 脚本怎么样?什么是正确的格式?这里有个问题,想解决了半天,麻烦你看看stackoverflow.com/questions/65214195/…
  • 您的问题已被删除,但您将添加一个- script: 部分并将您的代码放入其中。每行应以破折号开头。有时您可能需要将行括在引号中才能读取某些字符。
【解决方案2】:

您不能向 yml 文件添加条件,它只是一种文本格式化方式,而不是一种语言。 但是,您仍然可以将 yml 文件加载到编程语言中,并且可以将 if else 应用于它。基于字符串。

【讨论】:

  • 感谢一百万的回复,如果你能给我一个例子,我会很感激你的?以及如何将 yml 文件添加到编程语言中?
  • 这不是真的。例如,在我的代码中,我使用以下代码 nagiosgroup:“{{ 'srv-test' if inventory_hostname in groups['KISS_ACPT'] else 'srv-dev' }}”
  • 这不是真的。例如,在我的代码中,我使用以下代码 vartodefine:“{{ 'value1' if inventory_hostname in groups['BLAH'] else 'value2' }}”
  • 我想在 yaml 中运行一个 bash 脚本,你能看看这个问题吗?stackoverflow.com/questions/65214195/…
【解决方案3】:

试试这个

vartodefine: "{{ 'value1' if condition else 'value2' }}"

【讨论】:

    【解决方案4】:

    请尝试以下 Yaml 文件中的条件语法

    JsNames:
     - name: 'jquery.min.js'
     - name: 'script.js'
    {{ if eq site.data.settings.requiredjs "yes" }}
     - name: 'new.js'
    {{ end }}
    

    【讨论】:

      【解决方案5】:
      {{if .Env.LOCAL_VARIABLE| eq ""}}
          - /^max_wal_senders = 0\s*.*/
      {{ else }}
          - /^max_wal_senders = 10\s*.*/
          - /^vacuum_defer_cleanup_age = {{.Env.VACUUM}}\s*.*/
      {{ end }}
      

      【讨论】:

        【解决方案6】:

        当有多个配置文件时,一个优雅的选项如下:

        application.yml

        kafka.bootstrap-servers-nonprod: "nonprod-value"
        kafka.bootstrap-servers-prod: "prod-value"
        kafka.bootstrap-servers: ${kafka.bootstrap-servers-${env-type}}
        

        application-qa.yml

        env-type: "nonprod"
        #kafka.bootstrap-servers will have the value: "nonprod-value"
        

        application-prod.yml

        env-type: "prod"
        #kafka.bootstrap-servers will have the value: "prod-value"
        

        【讨论】:

          【解决方案7】:

          试试这个代码,“item”这个词可以是任何你想要的:

          {% for item in JsNames %}
            {% if name == 'jquery.min.js' %}
              excute your code
            {% elif name == 'script.js' %}
              excute your code
            {% else %}
              excute your code
            {% endif %}
          {% else %}
            some error message
          {% endfor %}
          

          【讨论】:

          • 哪个库能够在 python 中支持这个?我尝试了默认的pyyaml,它在解析%found character '%' that cannot start any token时显示错误
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-13
          • 2011-01-17
          • 2020-05-23
          • 2021-09-08
          • 1970-01-01
          相关资源
          最近更新 更多