YAML中的恐惧与厌恶

2020-10-22 08:56:58

这篇文章最初是作为DevOps‘ish188的介绍而写的,已经根据反馈进行了修改,并被认为值得作为自己的博客文章分享。

有一天,当我建议人们查看yq时,我们有点陷入困境,“这个项目的目标是成为yaml文件的jq或sed。”首先,这个项目没有什么问题。我喜欢它,我发现这个工具很有用,仅此而已。但这场伟大的辩论开始于我们的主和救世主YAML。是的,我知道,XML、JSON、YAML、TOML、接下来是一场令人厌倦的老争论。

让我把水平定在这里。我经常开玩笑说,我是一名“日历驱动的YAML工程师”,多年来一直在使用openShift.tv。但是我不太喜欢YAML。让我给你讲个故事…。

2012年,我在麦克拉奇互动公司(McClatchy Interactive)工作(在真正黑暗的时期之前),我喜欢我正在做的系统和安全工作。我们把我们的机器创造归结为有限科学。裸机启动后,您将MAC地址输入到一个数据库文件中,然后离开机器去获取所有所需的打包和代码,以便在我们的基础架构中按照其定义的目的运行。

CFEngine根据目的对机器进行了相应的配置,并将其放置在网络中,为代码部署做好了准备。DevOps是该公司当时正在拥抱的东西。因此,DevOps Tandem当时没有使用现有的CFEngine基础设施,而是使用Puppet进行代码部署。这个系统一直运行得很好,直到不是这样。基础设施(数据中心的典型IT)和软件部署和配置(开发人员)之间有明显的界限。在我们的案例中,DevOps更多地代表开发团队,而不是运营团队。听起来耳熟吗?

但是,正如你可以想象的那样,即使所有的自动化都到位了,这仍然是一种让人望而却步的场景。当由于修改代码库而需要安装系统包(例如,需要更新版本的Perl)或使用不同操作系统包的新服务上线时,Puppet现在必须执行CFEngine正在执行的任务:系统管理。我们的想法是建立一个全面的WebOps团队,该团队具有跨职能、精力充沛、技术含量高的特点。DevOps领导向团队下达的第一条法令是,“阅读YAML规范。”我们都跳进了傀儡池,以帮助更好地整合我们的流程和程序。

“Ugh…”我心里想。“我必须阅读这份写得很糟糕的说明书。”它不是我喜欢读的RFC,但是关于YAML规范的一些事情让我感到难过和沮丧。语法真的很重要。空格真的很重要。我的经历告诉我,死记硬背和让人类看到某些东西的缺失是一项令人难以置信的困难任务。这些都是大多数黑客在侵入系统时所利用的东西。人类找不到东西或记忆东西的能力不如计算机。出于这些原因,我不太喜欢这种非标记语言。

令我恼火的是,YAML的创建者将目标#1定为“YAML易于被人类阅读”。它是人类可读的,因为您在标量和结构中看到了人类可读的单词,但是YAML有一些令人不快的地方。它是一种自称不是标记语言的标记语言。我坚信,标记语言应该让人类的事情变得更简单,而不是更难(在我看来,XML是标记语言的对立面)。

在这里,我是DevOps游戏的新手,学习了一些核心的开发人员概念来理解标记语言,其中的关键是两个阿喀琉斯之踵。我也不喜欢和木偶一起工作,因为它太大、太笨重、太笨重了。但是,在这里,我被头朝下推到了这个世界上。不妨好好利用一下。从那以后,我接受了YAML,但这并不意味着我要用YAML格式写我的笔记。

DevOps,Cloud Native,Open Source,行业新闻,以及由开源专业人士、DevOps领导者和云本地计算基金会(Cloud Native Computing Foundation,CNCF)大使Chris Short汇集的“ISH”。

我们使用SendinBlue作为我们的营销平台。单击下面提交此表格,即表示您确认您提供的信息将根据其使用条款传输到SendinBlue进行处理。

近十年后,我看到了YAML同样的令人不快的光芒。它对新人并不友好,就像git不友好一样。库伯内斯几乎滥用了yaml,以至于它成了笑柄。我们也已经坚持了很长一段时间。如果Kubernetes是未来的平台,这意味着我们将使用2009年编写的规范,一直持续到本世纪30年代(可能还会更久)。

我希望有可能减少替换量。我们需要像yq这样的工具,这一事实确实表明,当涉及到规模化的YAML野兽时,还有一些工作要做。在2009年,当最新版本的YAML规范被编写时,还没有人想到将Pod安全策略应用于遍布世界各地数据中心的大规模Kubernetes部署。将来会有更好的东西出现,我希望采用它不会像采用YAML那样痛苦。

请记住,将事物与喜欢的事物进行相对比较(YAML与XML或YAML与JSON)完全会打乱初学者的旅程。从新手开始,从那里往前走。YAML不是。Git不是。逐渐地,YAML比XML更好,但与HTML或Markdown(我可以教给高管和孩子们一样的东西)相比,它很糟糕。是的,平衡机器和人类的可读性是很困难的。妥协很糟糕,但在某种程度上,有足够的计算来运行一个进程,以接收100%人类可读的东西,并使其100%机器可读。在同样意义上,计算机已经变得非常容易获得,以至于我们现在几乎所有的HTTP流量都是gzip和加密的,我希望我们可以用系统配置语言做同样的事情。将复杂性从人类转移到代码。计算机在记忆事物和句法语义方面比人类所希望的要好得多。

在人和机器的可读性之间总是有一个令人愉快的中介。然而,我更愿意在这里看到一种以人为本,80-20的方法,在这种方法中,入门级技能可以解决80%的标记语言用例。在我看来,这才是真正的涅槃。总是会有复杂性,并且需要了解您正在使用的工具。但是,YAML给了我们一个例子,可以也应该有更好的东西。