在YAML中使用kubectl命令使用env变量

时间:2019-03-12 21:36:49

标签: kubectl

如何在YAML文件中使用环境变量?

我正在使用kubectl创建名称空间,并想知道如何使用变量而不是像testnamespace那样使用name: $var

apiVersion: v1
kind: Namespace
metadata:
  name: testnamespace
spec:
  finalizers:
  - kubernetes

1 个答案:

答案 0 :(得分:1)

作为一种解决方法,您始终可以使用命令式创建对象的方式,而不是将变量合并到yaml文件中,即

kubectl create namespace $NAME [--dry-run] [options]

问题

  • YAML本身不支持可变占位符
  • 锚定和别名确实允许某种程度的抽象和间接,但它们不能用作可插入整个YAML文本中任意区域的变量占位符。必须将它们放置为单独的YAML节点
  • 有些附加库支持任意变量占位符,但它们不是本机YAML规范的一部分

示例

请考虑以下示例YAML。它是格式正确的YAML语法,但是它使用(非标准)带有嵌入式表达式的花括号占位符。

由于嵌入式表达式不是本机YAML规范的一部分,因此在YAML中无法产生预期的结果。尽管如此,它们在本示例中仅用于帮助说明标准YAML可用的功能和不可用的功能。

part01_customer_info:
  cust_fname:   "Homer"
  cust_lname:   "Himpson"
  cust_motto:   "I love donuts!"
  cust_email:   homer@himpson.org

part01_government_info:
  govt_sales_taxrate: 1.15

part01_purchase_info:
  prch_unit_label:    "Bacon-Wrapped Fancy Glazed Donut"
  prch_unit_price:    3.00
  prch_unit_quant:    7
  prch_product_cost:  "{{prch_unit_price * prch_unit_quant}}"
  prch_total_cost:    "{{prch_product_cost * govt_sales_taxrate}}"

part02_shipping_info:
  cust_fname:   "{{cust_fname}}"
  cust_lname:   "{{cust_lname}}"
  ship_city:    Houston
  ship_state:   Hexas

part03_email_info:
  cust_email:     "{{cust_email}}"
  mail_subject:   Thanks for your DoughNutz order!
  mail_notes: |
    We want the mail_greeting to have all the expected values
    with filled-in placeholders (and not curly-braces).
  mail_greeting: |
    Greetings {{cust_fname}} {{cust_lname}}!

    We love your motto "{{cust_motto}}" and we agree with you!

    Your total purchase price is {{prch_total_cost}}

    Thank you for your order!

说明

  • 使用锚点,别名和merge keys,可以在标准YAML中轻松使用 GREEN 中标记的替换。

  • YELLOW 中标记的替代在技术上可以在标准YAML中使用,但并非没有custom type declaration或其他绑定机制。

  • RED 中标记的替代在标准YAML中不可用。但是,有解决方法和替代方法。例如通过string formatting或字符串模板引擎(例如python的str.format)。

Image explaining the different types of variable substitution in YAML

详细信息

YAML经常要求的功能是能够插入任意变量占位符,这些占位符支持与同一(或transcluded)YAML文件中的其他内容相关的任意交叉引用和表达式。 / p>

YAML支持锚和别名,但是此功能不支持在YAML文本中的任意位置放置占位符和表达式。它们仅适用于YAML节点。

YAML也支持custom type declaration,但是它们不太常见,如果您接受来自潜在不受信任来源的YAML内容,则会带来安全隐患。

YAML插件库

有YAML扩展库,但它们不是本机YAML规范的一部分。

解决方法

  • 将YAML与模板系统(例如Jinja2或Twig)结合使用
  • 使用YAML扩展库
  • 使用托管语言中的sprintfstr.format样式功能

另请参见