[译] 为什么你该放弃 YAML,改用 Jsonnet

原文:Why you should ditch YAML and use Jsonnet instead 作者:Joachim Bargsten · 原文发表于 2023-01-14。 译注:文中的“我”指原作者,工具和文档的相关描述保留原文发表时的语境。 我说不清自己究竟是什么时候想明白的。不过,看看 YAML 的格式和它的用法,我觉得这准是魔鬼的杰作之一。就像苍蝇被一大坨牛粪吸引,包括我在内的开发者,也被一股无形的力量推向了这种格式。 事情本来可以很简单。能收拾配置乱摊子的替代方案多的是,有类型的、无类型的都有。可不不不,我们偏要用 YAML。我大概是在第一次看到 Helm chart 时想明白这件事的。过了一阵,我才捋清这套逻辑: Helm 是 Kubernetes 的包管理器。 我把 Helm chart 写成“包”,好让别人复用。 压根没人复用这些 chart。真有人复用,就会产生极其紧密的耦合,正是每篇讲 clean code 的博客都在警告的那一种。 反复试错,直到跑通。 就快搞定了,只差把缩进调对。 或者,这就是所谓的“Arbeitsbeschaffungsmaßnahme”:人为增加工作量,好给更多开发者找点活干。 我也说不准。 YAML 的规范复杂得过了头,还会出现 Norway Problem 这样的意外解析结果,可能存在安全问题,而且经常被滥用,拿来解决本不该由 YAML 解决的问题。 还有什么替代方案? TOML HCL DHALL CUE Nix / Nickel 还可以继续列下去…… 我开始尝试 Jsonnet 和 HOCON。HOCON 在 Java/Scala 圈子之外没多少人知道,其他语言对它的支持也就……一般般。 那 Jsonnet 呢?我个人觉得,它在能力和简洁性之间拿捏得刚好。 Jsonnet 简介 Jsonnet 是什么?简单说: 面向应用和工具开发者的 data templating language。 可以把它看成增强版 JSON。从技术上说,它是 JSON 的 superset,加入了一些编程语言结构。因此,Jsonnet 需要先“编译”或转换,通常输出为 JSON。 ...

2026-11-09 · 3 min · 573 words · Joachim Bargsten

关于自动化配置还有什么好说的呢?

最近我们团队正在将生产环境的配置进行自动化。简单地说就是使生产环境在任何地方都可以快速的搭建起来,比如程序员在自己的机器上,公司内部的机器上,还有云上。 本文就是想阐明为什么要自动化配置。 进行配置自动化的这个过程,我发现,问题不在于程序员懂不懂Ansible、Chef、Puppet这些自动化配置工具的使用。 问题在于对“配置”本身的理解。我甚至发现还有运维人员也不能理解为什么要将配置自动化。 配置是什么? 很多人都将搭建Tomcat、Nginx这类脚本理解成一个个“任务”。这类脚本还不能被称为“配置”。 而这类Tomcat、Nginx的安装脚本大概是这样: apt-get install build-essential apt-get install libtool cd /usr/local/src wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.37.tar.gz tar -zxvf pcre-8.37.tar.gz cd pcre-8.34 ./configure make make install ..... 脚本来自:http://www.nginx.cn/install 运行这类脚本时,大脑里的概念是:我要“安装”Tomcat、Nginx。这类脚本被当成“动词”存在。也就是说在面对一台机器时,我们的思维方式是:我要写一个if来判断Tomcat是不是已经安装,如果没有安装,就是执行apt-get install,blabla…… 但是,现实的自动化配置工具Ansible、Chef、Puppet告诉我们,自动化配置的脚本更应当充当机器环境的状态的描述文档。也就是面对机器时,我们应该使用“形容”词。什么意思呢?来几个配置体会下: Ansible: # ./ansible-nginx/tasks/install_nginx.yml # 使用这个7-0.el7版本的yum包 - name: NGINX | Installing NGINX repo rpm yum: name: http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm # 当前机器的nginx的状态应该是最新版本 - name: NGINX | Installing NGINX yum: name: nginx state: latest # 当前机器的nginx service的状态应该是已经启动的。至于如何确保nginx这个service是如何启动的,我们不需要关心。 - name: NGINX | Starting NGINX service: name: nginx state: started 配置来自:https://www.nginx.com/blog/installing-nginx-nginx-plus-ansible/ ...

2016-08-12 · 1 min · 119 words · 翟志军 Jack Zhai