【笔记】Helm-5 Chart模板指南-6 流控制

流控制

控制结构(在模板语言中称为“actions”)提供给您和模板作者控制模板迭代流的能力。Helm的模板语言提供了以下控制结构:

if/else,用来创建条件语句

with,用来指定范围

range,提供“for each”类型的循环

除了这些之外,还提供了一些声明和使用命令模板的关键字:

define在模板中声明一个新的命名模板

template导入一个命名模板

block声明一种特殊的可填充的模板块

该部分,我们会讨论关于if,with,和range。其他部分会在该指南的“命名模板”部分说明。

If/Else

第一个控制结构是在按照条件在一个模板中包含一个块文本。即if/else块。

基本的条件结构看起来像这样:

{{ if PIPELINE }}

  # Do something

{{ else if OTHER PIPELINE }}

{{ else }}

  # Default case

{{ end }}

注意我们讨论的是管道而不是值。这样做的原因是要清楚地说明控制结构可以执行整个管道,而不仅仅是计算一个值。

如果是以下值时,管道会被设置为false:

布尔false

数字0

空字符串

nil(空或null)

空集合(map,slice,tuple,dict,array)

在所有其他条件下,条件都为true。

让我们先在配置映射中添加一个简单的条件。如果饮品是coffee会添加另一个配置:

apiVersion: v1

kind: ConfigMap

metadata:

  name: {{ .Release.Name }}-configmap

data:

  myvalue: "Hello World"

  drink: {{ .Values.favorite.drink | default "tea" | quote }}

  food: {{ .Values.favorite.food | upper | quote }}

  {{ if eq .Values.favorite.drink "coffee" }}mug: "true"{{ end }}

apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Release.Name }}-configmap
data:myvalue: "Hello World"drink: {{ .Values.favorite.drink | default "tea" | quote }}food: {{ .Values.favorite.food | upper | quote }}{{ if eq .Values.favorite.drink "coffee" }}mug: "true"{{ end }}

由于我们在最后一个例子中注释了drink: coffee,输出中就不会包含mug: "true"标识。但如果将这行添加到values.yaml文件中,输入就会是这样:

# Source: mychart/templates/configmap.yaml

apiVersion: v1

kind: ConfigMap

metadata:

  name: eyewitness-elk-configmap

data:

  myvalue: "Hello World:

  drink: "coffee"

  food: "PIZZA"

  mug: "true"

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: eyewitness-elk-configmap
data:myvalue: "Hello World"drink: "coffee"food: "PIZZA"mug: "true"

控制空格

查看条件时,我们需要快速了解一下模板中控制空白的方式,格式化之前的例子,使其更易于阅读:

apiVersion: v1

kind: ConfigMap

metadata:

  name: {{ .Release.Name }}-configmap

data:

  myvalue: "Hello World"

  drink: {{ .Values.favorite.drink | default "tea" | quote }}

  food: {{ .Values.favorite.food | upper | quote }}

  {{ if eq .Values.favorite.drink "coffee" }}

  mug: "true"

  {{ end }}

初始情况下,看起来没问题。但是如果通过模板引擎运行时,我们将得到一个不幸的结果:

$ helm install --dry-run --debug ./chart

$ helm install --dry-run --debug ./mychart
SERVER: "localhost:44134"
CHART PATH: /Users/mattbutcher/Code/Go/src/helm.sh/helm/_scratch/mychart
Error: YAML parse error on mychart/templates/configmap.yaml: error converting YAML to JSON: yaml: line 9: did not find expected key

发生了啥?因为空格导致生成了错误的YAML。

# Source: mychart/templates/configmap.yaml

apiVersion: v1

kind: ConfigMap

metadata:

  name: eyewitness-elk-configmap

data:

  myvalue: "Hello World"

  drink: "coffee"

  food: "PIZZA"

    mug: "true"

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: eyewitness-elk-configmap
data:myvalue: "Hello World"drink: "coffee"food: "PIZZA"mug: "true"

mug的缩进是不对的。取消缩进重新执行以下:

apiVersion: v1

kind: ConfigMap

metadata:

  name: {{ .Release.Name }}-configmap

data:

  myvalue: "Hello World"

  drink: {{ .Values.favorite.drink | default "tea" | quote }}

  food: {{ .Values.favorite.food | upper | quote }}

  {{ if eq .Values.favorite.drink "coffee" }}

  mug: "true"

  {{ end }}

apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Release.Name }}-configmap
data:myvalue: "Hello World"drink: {{ .Values.favorite.drink | default "tea" | quote }}food: {{ .Values.favorite.food | upper | quote }}{{ if eq .Values.favorite.drink "coffee" }}mug: "true"{{ end }}

这个就得到了合法的YAML,但是看起来还是有点滑稽:

# Source: mychart/templates/configmap.yaml

apiVersion: v1

metadata:

  name: telling-chimp-configmap

data:

  myvalue: "Hello World"

  drink: "coffee"

  food: "PIZZA"

  mug: "true"

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: telling-chimp-configmap
data:myvalue: "Hello World"drink: "coffee"food: "PIZZA"mug: "true"

注意在YAML中有一个空行,为什么?当模板引擎运行时,它移除了{{和}}里面的内容,但是留下的空白完全保持原样。

YAML认为空白是有意义的,因此管理空白变得很重要。幸运的是,Helm模板有些工具可以处理此类问题。

首先,模板声明的大括号语法可以通过特殊的字符修改,并通知模板引擎取消空白。{{- (包括添加的横杠和空格)表示向左删除空白,而 -}}表示右边的空格应该被去掉。一定注意空格就是换行

小贴士:要确保-和其他命令之间有一个空格。{{- 3 }}表示“删除左边空格并打印3”,而{{-3 }}表示“打印-3”。

使用这个语法,我们就可修改我们的模板,去掉新加的空白行:

apiVersion: v1

kind: ConfigMap

metadata:

  name: {{ .Release.Name }}-configmap

data:

  myvalue: "Hello World"

  drink: {{ .Values.favorite.drink | default "tea" | quote }}

  food: {{ .Values.favorite.food | upper | quote }}

  {{- if eq .Values.favorite.drink "coffee" }}

mug: "true"

{{- end }}

apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Release.Name }}-configmap
data:myvalue: "Hello World"drink: {{ .Values.favorite.drink | default "tea" | quote }}food: {{ .Values.favorite.food | upper | quote }}{{- if eq .Values.favorite.drink "coffee" }}mug: "true"{{- end }}

只是为了把这一点搞清楚,我们来调整上述内容,用一个*来代替每个循环此规则被删除的空白,在行尾的*表示删除新行的字符:

apiVersion: v1

kind: ConfigMap

metadata:

  name: {{ .Release.Name }}-configmap

data:

  myvalue: "Hello World"

  drink: {{ .Values.favorite.drink | default "tea" | quote }}

  food: {{ .Values.favorite.food | upper | quote }}*

**{{- if eq .Values.favorite.drink "coffee" }}

  mug: "true"*

**{{- end }}

apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Release.Name }}-configmap
data:myvalue: "Hello World"drink: {{ .Values.favorite.drink | default "tea" | quote }}food: {{ .Values.favorite.food | upper | quote }}*
**{{- if eq .Values.favorite.drink "coffee" }}mug: "true"*
**{{- end }}

记住这一点,我们可以通过Helm运行模板并查看结果:

# Source: mychart/templates/configmap.yaml

apiVersion: v1

kind: ConfigMap

metadata:

  name: clunky-cat-configmap

data:

  myvalue: "Hello World"

  drink: "coffee"

  food: "PIZZA"

  mug: "true"

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: clunky-cat-configmap
data:myvalue: "Hello World"drink: "coffee"food: "PIZZA"mug: "true"

要注意这个删除字符的更改,很容易意外地出现情况:

food: {{ .Values.favorite.food | upper | quote }}

{{- if eq .Values.favorite.drink "coffee" -}}

mug: "true"

{{- end -}}

food: {{ .Values.favorite.food | upper | quote }}{{- if eq .Values.favorite.drink "coffee" -}}mug: "true"{{- end -}}

这样会变成food: "PIZZA"mug:"true",因为这把两边的新行都删除了。

小贴士:关于模板中的空白控制,请查看 官方Go模板文档

template package - text/template - Go Packages

最终,有时这更容易告诉模板系统如何缩进,而不是试图控制模板指令间的间距。因此,您有时会发现使用indent方法{{ indent 2 "mug:"true" }}会很有用。

————————————

仅用于本人学习

来源:Helm | Docs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/663351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024技术发展洞察与趋势学习总结

2023技术发展洞察 2024技术发展趋势

QT假如有三个线程如何保证顺序执行

目录 1 QSemaphore 2 QMutex和QWaitCondition 3 QFuture 1 QSemaphore #include <QSemaphore> #include <QThread> #include <QDebug> QSemaphore sem1(1); QSemaphore sem2(0); QSemaphore sem3(0);class Thread1 : public QThread { public:void run()…

服务器为什么老是被攻击?被攻击了怎么办?

1、关闭端口&#xff0c;只打开必要的端口 服务器端口是攻击的主要入口&#xff0c;是服务器的外部窗口。服务器上的开放端口被黑客使用&#xff0c;他们通过这些开放端口攻击服务器。相对有效的预防方法是关闭一些不必要的端口&#xff0c;然后修改关键端口。如果你少开一个开…

《Lua程序设计》-- 学习10

环境&#xff08;Environment&#xff09; 具有动态名称的全局变量 全局变量的声明 由于Lua语言将全局变量存放在一个普通的表中&#xff0c;所以可以通过元表来发现访问不存在全局变量的情况。 正如前面所提到的&#xff0c;我们不允许值为nil的全局变量&#xff0c;因为值为…

Beats:在单个服务器上配置多个 Beats 实例

本文档作为如何在同一服务器上配置和运行 Filebeat/Metricbeat/Auditbeat 的多个实例的指南。 当你需要为同一台计算机上的不同应用程序或环境分离数据收集和处理时&#xff0c;此设置特别有用。 在今天的展示中&#xff0c;我们将以 Filebeat 为例来进行展示。此方法也适用于…

element-ui上传图片组件封装

//上传图片组件 定义文件imageUpload <template><div class"component-upload-image"><el-upload multiple :action"uploadImgUrl" list-type"picture-card" :on-success"handleUploadSuccess":before-upload"han…

Mybatis | 逻辑 sql - 结果的映射默认有缓存

mybatis 里 select 方法默认会使用缓存&#xff0c;即&#xff0c;如果逻辑 sql 的入参不变&#xff0c;则会走缓存。 所以对于只有表名 tableName 变&#xff08;用于 sharding&#xff09;的情况下&#xff0c;需要修改 xml 文件&#xff1a;flushCache true&#xff0c;来…

分享一个Qt使用的模块间通信类

需求&#xff1a; 不同线程&#xff0c;或者同一线程的不同类之间通信&#xff0c;按照Qt的机制&#xff0c;定义一个信号&#xff0c;一个槽&#xff0c;然后绑定。以两个类A,B为例&#xff0c;A触发一个信号&#xff0c;B执行一个槽&#xff0c;在定义好信号和槽之后&#x…

【Java程序设计】【C00196】基于(JavaWeb+SSM)的旅游管理系统(论文+PPT)

基于&#xff08;JavaWebSSM&#xff09;的旅游管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的旅游平台 本系统分为前台、管理员2个功能模块。 前台&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的…

C# 引用同一个dll不同版本的程序集

因为项目需要所以必须在项目中引用不同版本的同一程序集 我要引用的文件是newtonsoft.json.dll 两个版本为12.0.0.0 和4.0.0.0 1.如果已经先引入了newtonsoft.json 12.0.0.0版本的程序集&#xff0c;如果直接引入另一个版本的程序集的话会提示不成功&#xff0c;所以先将另一个…

分布式ID介绍实现方案总结

分布式 ID 介绍 什么是 ID&#xff1f; 日常开发中&#xff0c;我们需要对系统中的各种数据使用 ID 唯一表示&#xff0c;比如用户 ID 对应且仅对应一个人&#xff0c;商品 ID 对应且仅对应一件商品&#xff0c;订单 ID 对应且仅对应一个订单。 我们现实生活中也有各种 ID&…

BetrFS: A Compleat File System for Commodity SSDs——论文阅读

EuroSys 2022 Paper 分布式元数据论文汇总 问题 在不同的工作负载下&#xff0c;没有单一的Linux文件系统在普通SSD上始终表现良好。我们将一个完备的文件系统定义为在各种微基准测试和应用程序中&#xff0c;没有一个工作负载的性能低于最佳文件系统性能的30%&#xff0c;并…

EasyX图形库学习(一)

目录 一、easyX图形库基本介绍 1、easyX的原理 2、easyX的安装 3、easyX的颜色&#xff08;RGB颜色模型&#xff09; 颜色模型相关函数: 4、easyX的坐标 二、相关函数介绍: 绘图设备相关函数&#xff1a; 图形颜色及样式设置相关函数: 图形绘制相关函数: 文字输出相关…

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第十一章 反思C++面向对象与虚函数(下)

11.7.2 值语义与生命期 值语义的一个巨大好处是生命期管理很简单&#xff0c;就跟int一样——你不需要操心int的生命期。值语义的对象要么是stack object&#xff0c;要么直接作为其他object的成员&#xff0c;因此我们不用担心它的生命期&#xff08;一个函数使用自己stack上…

npm使用国内淘宝镜像

一、命令配置 1、设置淘宝镜像源 npm config set registry https://registry.npmmirror.com2、查看镜像使用状态 npm config get registry如果返回https://registry.npmmirror.com/,说明配置的是淘宝镜像。 如果返回https://registry.npmjs.org/,说明配置的是官网镜像。 二…

分享个前端工具-取色调色工具

这里虽然贴了两个&#xff0c;但推荐 Pipette. PipetteWin22.10.22.zip: https://download.csdn.net/download/rainyspring4540/88799632 图标&#xff1a; 界面&#xff1a; ColorPix https://download.csdn.net/download/rainyspring4540/88799642 图标&#xff1a; 界面…

开源协议介绍

开源协议是控制开源软件分发的法律声明&#xff0c;它使得软件能够被任何人自由使用、复制、修改和分发。下面是一些常见的开源协议&#xff1a; MIT 许可证&#xff1a;非常灵活的许可证&#xff0c;允许你做几乎任何事情&#xff0c;只要在副本中包含原始的版权和许可声明。…

Google Play上架:因行为透明度被拒审或下架的政策自查(基于区块链的内容)

近期很多朋友的项目出现因行为透明度问题被谷歌拒审或者已经上架的包被下架甚至封号,今天解释一下为什么会被封号下架,根据是什么? 目录 政策发布时间与截止时间政策内容政策背景政策解析和问题讲解政策发布时间与截止时间 基于区块链的内容相关政策,于2023-07-12 公布,…

看完这篇文章,你一定能看懂Datasheet!

大家好&#xff0c;我是砖一。 针对以上学妹的疑问&#xff0c;我有几点建议&#xff0c;大家可以听一下~ 一&#xff0c;怎么样查找Datasheet&#xff08;数据手册&#xff09; 大多数人下意识就点开浏览器&#xff0c;把型号往里面一输&#xff0c;不建议这样。 对于刚入行…

Fluent的小bug处理:后处理截面显示存在漏洞

最近发现的Fluent的bug&#xff0c;关于后处理截面显示不完整的问题。 1 现象 在使用六面体核心类型单元&#xff08;包括四面体-六面体核心和多面体-六面体核心&#xff09;进行网格划分的时候&#xff0c;可能会在截面上不能完整捕捉单元形状及其分布状态&#xff0c;导致做…