<!DOCTYPE html> <html style="height: 100%; margin: 0;"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" > <meta name="viewport" content="width=device-width" /> <link rel="stylesheet" data-name="vs/editor/editor.main" href="https://microsoft.github.io/monaco-editor/node_modules/monaco-editor/min/vs/editor/editor.main.css"> <title>π¨π¨ That's a lot of YAML π¨π¨</title> <style> .nojs { font-family: monospace; white-space: pre; padding: 0 2em; } </style> </head> <body style="height: calc(100% - 75px); margin: 35px 0 0 0;"> <div id="container" style="height: 100%" class="nojs"> # 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 get ... 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\\\" . # π» Overhead 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. π </div> <script>var require = { paths: { 'vs': 'https://microsoft.github.io/monaco-editor/node_modules/monaco-editor/min/vs' } };</script> <script src="https://microsoft.github.io/monaco-editor/node_modules/monaco-editor/min/vs/loader.js"></script> <script src="https://microsoft.github.io/monaco-editor/node_modules/monaco-editor/min/vs/editor/editor.main.nls.js"></script> <script src="https://microsoft.github.io/monaco-editor/node_modules/monaco-editor/min/vs/editor/editor.main.js"></script> <a href="https://github.com/ghuntley/noyaml" class="github-corner" aria-label="View source on Github"><svg width="80" height="80" viewBox="0 0 250 250" style="fill:#fff; color:#151513; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a><style>.github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}</style> <script> (function () { // Exit early if the libraries have not loaded if (!window.monaco) return; var container = document.getElementById('container'); var content = container.textContent.trim(); // Trim off the leading and trailing newline // Clear the fallback content and styling container.innerHTML = ''; container.className = ''; monaco.editor.create(container, { value: content, language: 'yaml', fontSize: 13, codeLens: false, colorDecorators: false, scrollBeyondLastLine: false, minimap: { enabled: false }, automaticLayout: true }); }()); </script> <script data-collect-dnt="true" async src="https://scripts.simpleanalyticscdn.com/latest.js"></script> <noscript><img src="https://queue.simpleanalyticscdn.com/noscript.gif?collect-dnt=true" alt="" referrerpolicy="no-referrer-when-downgrade"/></noscript> </body> </html>