那是相当多的 YAML
That's a Lot of YAML

原始链接: https://noyaml.com/

本摘要概括了文中针对 DevOps 领域中广泛使用 YAML 所表达的挫败感。 ### 反对使用 YAML 的理由 尽管 YAML 已因 Kubernetes 的采用而成为配置领域的行业标准,但它常被诟病为开发者的“陷阱”。由于其规范复杂且容易被误解,该格式以行为不可预测而臭名昭著。 **主要痛点包括:** * **数据类型模糊:** YAML 经常误读简单值,例如将“NO”(挪威)转换为布尔值 `false`,篡改版本号(如将 `1.70` 变成 `1.7`),或将 `04:30` 等字符串视为六十进制整数。 * **解析不一致:** 由于不同实现版本的 YAML 解析器差异巨大,在一个环境中可以运行的文件在其他环境中往往会失败。 * **安全风险:** 许多 YAML 解析器在处理不可信输入时容易受到代码注入攻击。 * **维护噩梦:** 缺乏模式校验(schema validation),且配置配置容易演变成难以阅读的“YAML 乱炖”,导致调试极其困难。 归根结底,作者建议转向更稳健的配置语言(如 CUE、Dhall 或 Jsonnet),这些语言能提供更好的安全性、可预测性以及开发体验。

这场 Hacker News 的讨论围绕着围绕 YAML 的不满展开,起因是“That’s a Lot of YAML”网站。社区的主要观点包括: * **版本问题**:许多批评集中在过时的 YAML 1.1 规范上(该版本在 Kubernetes 等系统中依然普遍存在),而非更稳定的 1.2 版本。 * **滥用与工具**:一些用户认为,YAML 的问题源于开发者将配置格式用于处理复杂逻辑——即在没有调试工具或类型检查的情况下用 YAML 进行“编程”——而非语言本身的缺陷。 * **兼容性**:一个主要的争议点是缺乏严格的标准化,导致不同的序列化器和解析器表现不一致。 * **替代方案**:参与者提出了 TOML、Starlark 和 EDN 等替代方案,同时也承认 YAML 的生态系统和灵活性难以被取代。 * **理念**:几位评论者批评这种“反 YAML”情绪具有表演性质,并指出构建更好的基础设施比单纯抱怨一个广泛使用的行业标准更有成效。最终,共识是虽然 YAML 有其怪癖,但它的普及使得迁移变得困难。
相关文章

原文
🚨🚨 That's a lot of YAML 🚨🚨

# Made with 💖 by https://ghuntley.com after one too many CustomResourceDefinitions # Improvements welcome, mash the ↗️ Octocat ↗️ and share how YAML makes your life better. No: Body: Wants: To: Write: - YAML # 🤔 Why YAML is the right devops technology for you 🤔 # # - 100% test coverage, always compiles just fine with no errors or warnings, always shippable # - no enforced error handling during development because runtime "panic at the disco" in production is dope # - "something broke" is way better than stack traces with line numbers # - you need to burn hours as part of setting up a new CI pipeline # - safe choice with unquestionable industry adoption, "used by kubernetes" # - is marginally better than windows.ini # - unlike json [1][2], YAML supports comments # - no official documentation (other than a specification for implementers) is totally fine # - you need a super safe way to "execute this code" # 🍿 wait a sec, did you say "executable yaml"?? 🍿 # - https://ruby-doc.org/stdlib-2.4.0/libdoc/yaml/rdoc/YAML.html#module-YAML-label-Security # - https://www.php.net/manual/en/function.yaml-parse.php#refsect1-function.yaml-parse-notes # - https://securitylab.github.com/research/swagger-yaml-parser-vulnerability/ # - https://github.com/yaml/pyyaml/wiki/PyYAML-yaml.load(input)-Deprecation # 🚨 Anyone who uses YAML long enough will eventually get burned when attempting to abbreviate Norway 🚨 # `NO` is parsed as a boolean type, which with the YAML 1.1 spec, there are 22 options to write "true" or "false." # You have to wrap "NO" in quotes to get the expected result. NI: Nicaragua NL: Netherlands NO: Norway # 💣! # 🚨 Anyone wondering why their first seven Kubernetes clusters deploy just fine, and the eighth fails? 🚨 - 07 - 08 # Results in [ 7, "08" ] # YAML knows that, when you have something that looks like the time of day, # what you _really_ wanted is the time of seconds since midnight timeOfDay: whatYouWrote: 04:30 # And when you parse this file and serialize it again, you may get before YAML 1.2 ... whatYouSurelyMeant: 16200 # Have fun debugging this one! whatYouShouldHaveWritten: !!str 04:30 # YAML is the super best way to encode Octal (tm) and learning the hard way that Kubernetes uses YAML 1.1 # is a DevOps rite of passage. Below YAML 1.2 a large integer is automatically converted to octal.[3] - YAML 1.1 uses `0666` notation. - YAML 1.2 uses `0o666` notation # YAML is great for specifying package versions, as long as you like versions being parsed as floating point. versions: foo: 1.7 # These two packages have the same version. bar: 1.70 # These two packages have the same version. fizz: 1.7.0 # But these two packages have different versions. buzz: 1.70.0 # But these two packages have different versions. # 🤢 I have recently been learning GitHub Actions # # I just made 8 commits/pushes in one hour, and the last commit message, in its entirety, was: # # "I don't really like yml" - https://twitter.com/eric_sink/status/1430954572848287744 # 😭 If SQL were built on YAML 😭 SELECT: - num - name FROM: - customers WHERE EXISTS: SELECT: - name FROM: - orders WHERE: AND: - EQUALS: - customers.num - orders.customer_num - LT: - price - 50 # Speaking of CI, did you know that 8-character SHAs could be all numbers? # If the system that parses `my.flaky_version` is typed, it will happily explode 2% of the time. my: # this will be a string ~98% of the time flaky_version: ${GIT_SHORT_SHA} # this will be a string ~100% of the time string_version: "${GIT_SHORT_SHA}" # him: "Look, I bought a box of DevOps" # her: "You can't just buy a box of DevOps" # 🤣 https://twitter.com/mike_kaufmann/status/1454712996933025794 # "Don't forget the extra line break otherwise all shit goes to hell" # 👉 https://github.com/IronScheme/IronScheme/commit/2f847793946935bd9143cdfb064f9006f763df68 # 🤡 Doing the same thing with different CI providers 🤡 # Azure devops jobs: - job: job1 steps: - script: chmod +x ./script.sh - script: ./script.sh # CircleCI jobs: job1: steps: - checkout - run: "execute-script-for-job1" # Some future CI system, probably jobs: - steps: job1 - step1: - script: chmod +x ./script.sh - step2: - run: "execute-script-for-job1-inside-step2" # If you're building a YAML file for Cloudformation for a DashboardBody for Cloudwatch # and theres a SEARCH function? you need to escape the already-escaped and close the # whole JSON with double-quotes: "{ \"search(' var=\\\"blue\\\" . # 🍻 Overheard in a pub - The problem with YAML they did one thing well. Shitty boiler plate. Then everyone thought it was a good idea. # 💊 Mega twitter thread of pain # 👉 https://twitter.com/brunoborges/status/1098472238469111808 👈 # 📢 Mandatory reading 📢 # # "Today we’re going to look at some general problems with the YAML format" # 👉 https://arp242.net/yaml-config.html 👈 # # "We replaced 1,000 lines of YAML with 10 structs and people started contributing again" # 👉 https://tinyurl.com/lessons-in-over-engineering 👈 # # "What if you used the same language and tools you use to define your app to define your infrastructure?" # 👉 https://twitter.com/ellism/status/1008728148131733504 👈 # # "A YAML file is almost always still 'valid' even if it is trunca" # 👉 https://twitter.com/colmmacc/status/1057316977457324032 👈 # # "the bug was that the YAML parser ignored the negative signs ... so negative GPS coordinates became positive ones" # 👉 https://twitter.com/colmmacc/status/1063470541464461312 👈 # # "Every YAML parser is a custom YAML parser" # 👉 https://matrix.yaml.info/valid.html 👈 # # "There are 63 different ways to write multi-line strings in YAML" # 👉 https://stackoverflow.com/a/21699210/1094085 👈 # # "Toolchain version 1.70 is parsed as 1.7" # 👉 https://github.com/dtolnay/rust-toolchain/issues/112 👈 # # "StrictYAML Design Justifications" # 👉 https://hitchdev.com/strictyaml/why/ 👈 # 💭 Alternative options and approaches to DevOps (cough yamlops cough) 💭 # - https://media.ccc.de/v/36c3-11172-leaving_legacy_behind # - https://nickel-lang.org/ # - https://dhall-lang.org/ # - https://cuelang.org/ # - https://jsonnet.org/ # - https://www.youtube.com/watch?v=tl9I-R83lKo # - https://github.com/xtruder/kubenix/tree/kubenix-2.0/examples/nginx-deployment # - https://github.com/nin-jin/tree.d # 🏁 If you are vendor of developer tooling that is configurable via YAML, please do this 🏁 # - https://twitter.com/kzu/status/1163864030911578112 # - https://twitter.com/timeyoutakeit/status/1431052862138769408 # 📖 Footnotes 📖 # [1] You can do comments in json by `{"//": "A way to use comments in json"}` but it's icky. # [2] "Does ansible have a json schema? Yaml aint so bad with a schema."? # [3] Also see `python2 -c 'print 011' && echo $((011 + 1))` # and finally, here's some ⭐️⭐️⭐️⭐️⭐️ feedback from reddit.com: - I need to burn the very motherboard this site runs from. It’s that awful. - This is the worst website I've ever seen - I agree with the author in principle but that website is inexcusable. I'm going to add YAML config to my projects on Monday just to spite that horrific "website". - Wtf is this website and why does it repeatedly pop up my phone's keyboard - This Website is a giant editable textfield - Why?!? - Because it’s a good idea to demonstrate good standards while standing on one’s soapbox - The author of THAT website wants to tell the rest of us how to program. - While I agree with the spirit of the website (fuck yaml), the design decisions of the author are questionable to say the least. - The good news (I realised) was that you can select all the text of the site, and then delete it. Problem solved. - Fuck this website. Maybe if this person stopped bitching about yaml their website wouldn't blow. - Yeah, I’m not going to take advice on best practices from a guy whose website is a giant editable text field with unclickable hyperlinks. # ps. By design, this website is as usable as YAML. 💕

联系我们 contact @ memedata.com