プログラミング
YAML、それは多すぎる
That's a Lot of YAML (noyaml.com)
要約
この記事は、YAMLフォーマットの多くの問題点と、それが開発者や運用担当者にとってなぜしばしば苦痛の原因となるのかをユーモラスかつ皮肉たっぷりに解説しています。コメントのサポート、型変換の曖昧さ、予期せぬ挙動、セキュリティリスクなど、YAMLの設計上の欠陥を具体例を挙げて指摘し、代替案を示唆しています。
全文翻訳
これはhttps://ghuntley.com/によって、あまりにも多くのCustomResourceDefinitionsの後で作られました #改善歓迎、↗️Octocat↗️を叩いて、YAMLがあなたの人生をより良くする方法を共有してください。
いいえ:
本文:
欲しいもの:
書くこと:
- YAML
🤔 なぜYAMLがあなたにとって正しいDevOpsテクノロジーなのか? 🤔
- 100%のテストカバレッジ、常にエラーや警告なしでコンパイルされ、常にデプロイ可能
- 開発中の強制的なエラーハンドリングなし、なぜなら本番でのランタイム「パニック・アット・ザ・ディスコ」はクールだから
- 「何かが壊れた」は、行番号付きのスタックトレースよりもはるかに優れている
- 新しいCIパイプラインの設定の一部として時間を燃やす必要がある
- 疑いの余地のない業界の採用、「Kubernetesで使用されている」という安全な選択肢
- Windows.iniよりもわずかに優れている
- JSON[1][2]とは異なり、YAMLはコメントをサポートしています
- 公式ドキュメント(実装者向けの仕様以外)がないのは全く問題ない
- 「このコードを実行する」という非常に安全な方法が必要
🍿 ちょっと待って、「実行可能な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
🚨 長くYAMLを使っている人は、ノルウェーを省略しようとして最終的に痛い目を見るでしょう 🚨
`NO` はブール型として解析されます。YAML 1.1仕様では、「true」または「false」を記述する方法が22種類あります。
期待される結果を得るには、「NO」を引用符で囲む必要があります。
NI: ニカラグア
NL: オランダ
NO: ノルウェー
💣!
🚨 最初の7つのKubernetesクラスタは正常にデプロイされ、8番目が失敗する理由を不思議に思っている人はいますか? 🚨
- 07
- 08
結果は[ 7, "08" ]となります。
YAMLは、時刻のように見えるものがあった場合、あなたが本当に望んでいたのは深夜からの秒数であると認識します。
timeOfDay:
whatYouWrote: 04:30 # そして、このファイルを解析して再度シリアライズすると、YAML 1.2より前に得られるかもしれません...
whatYouSurelyMeant: 16200
whatYouShouldHaveWritten: !!str 04:30 # これをデバッグするのは楽しいでしょう!
YAMLはOctal (tm)をエンコードするのに最適な方法であり、KubernetesがYAML 1.1を使用していることを学ぶのは苦労です。
これはDevOpsの通過儀礼です。YAML 1.2より下では、大きな整数は自動的に八進数に変換されます。[3]
- YAML 1.1は `0666` 表記を使用します。
- YAML 1.2は `0o666` 表記を使用します。
YAMLはパッケージバージョンを指定するのに適していますが、バージョンが浮動小数点数として解析されるのが好きならの話です。
versions:
foo: 1.7 # これらの2つのパッケージは同じバージョンです。
bar: 1.70 # これらの2つのパッケージは同じバージョンです。
fizz: 1.7.0 # しかし、これらの2つのパッケージは異なるバージョンです。
buzz: 1.70.0 # しかし、これらの2つのパッケージは異なるバージョンです。
🤢 最近GitHub Actionsを学んでいます。
私は1時間に8回のコミット/プッシュを行い、最後のコミットメッセージは全体として次のようでした。
「私はymlがあまり好きではない」 - https://twitter.com/eric_sink/status/1430954572848287744
😭 もしSQLがYAMLで作られていたら😭
SELECT:
- num
- name
FROM:
- customers
WHERE EXISTS:
SELECT:
- name
FROM:
- orders
WHERE:
AND:
- EQUALS:
- customers.num
- orders.customer_num
- LT:
- price
- 50
CIといえば、8文字のSHAがすべて数字になる可能性があることを知っていましたか?
`my.flaky_version` を解析するシステムが型指定されている場合、2%の確率で正常に爆発します。
my:
# これは約98%の時間文字列になります
flaky_version: ${GIT_SHORT_SHA}
# これは約100%の時間文字列になります
string_version: "${GIT_SHORT_SHA}"
彼: 「見て、DevOpsの箱を買ったんだ」
彼女: 「DevOpsの箱は買えないわ」
🤣 https://twitter.com/mike_kaufmann/status/1454712996933025794
「余分な改行を忘れないでください。そうしないとすべてが地獄に落ちます」
👉 https://github.com/IronScheme/IronScheme/commit/2f847793946935bd9143cdfb064f9006f763df68
🤡 異なるCIプロバイダーで同じことをする🤡
Azure DevOps
jobs:
- job: job1
steps:
- script: chmod +x ./script.sh
- script: ./script.sh
CircleCI
jobs:
job1:
steps:
- checkout
- run: "execute-script-for-job1"
# いくつかの将来のCIシステム、おそらく
jobs:
- steps:
job1:
- step1:
- script: chmod +x ./script.sh
- step2:
- run: "execute-job1-script-inside-step2"
Cloudformation用のYAMLファイルをCloudwatchのDashboardBody用に構築していて、SEARCH関数がある場合、既にエスケープされているものをエスケープし、JSON全体を二重引用符で閉じる必要があります:"{ "search(' var=\"blue\" .
🍻 パブで overheard - YAMLの問題は、彼らが1つのことをうまくやったこと。ひどい定型文。それから誰もがそれが良い考えだと思った。
💊 Mega Twitterスレッドの苦痛
👉 https://twitter.com/brunoborges/status/1098472238469111808 👈
📢 必須の読み物 📢
「今日はYAMLフォーマットに関する一般的な問題のいくつかを見ていきます」
👉 https://arp242.net/yaml-config.html 👈
「YAML 1,000行を10個の構造体に置き換えたら、人々は再び貢献し始めました」
👉 https://tinyurl.com/lessons-in-over-engineering 👈
「アプリを定義するために使用するのと同じ言語とツールでインフラストラクチャを定義したらどうなるでしょうか?」
👉 https://twitter.com/ellism/status/1008728148131733504 👈
「YAMLファイルは、たとえ切り取られていても、ほぼ常に「有効」です」
👉 https://twitter.com/colmmacc/status/1057316977457324032 👈
「バグは、YAMLパーサーが負の記号を無視したことでした...そのため、負のGPS座標が正のものになりました」
👉 https://twitter.com/colmmacc/status/1063470541464461312 👈
「すべてのYAMLパーサーはカスタムYAMLパーサーです」
👉 https://matrix.yaml.info/valid.html 👈
「複数行文字列をYAMLで記述する方法は63通りあります」
👉 https://stackoverflow.com/a/21699210/1094085 👈
「ツールチェーンバージョン1.70は1.7として解析されます」
👉 https://github.com/dtolnay/rust-toolchain/issues/112 👈
「StrictYAML設計の正当化」
👉 https://hitchdev.com/strictyaml/why/ 👈
💭 DevOpsの代替オプションとアプローチ(咳、yamlops咳)💭
- 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
🏁 YAMLで設定可能な開発者ツールベンダーであれば、これを実行してください🏁
- https://twitter.com/kzu/status/1163864030911578112
- https://twitter.com/timeyoutakeit/status/1431052862138769408
📖 注釈 📖
[1] JSONでコメントを使用する方法は `{"//": "JSONでコメントを使用する方法"}` ですが、それはイケていません。
[2] 「AnsibleにはJSONスキーマがありますか?YAMLはスキーマがあればそれほど悪くはありません。」?
[3] `python2 -c 'print 011' && echo $((011 + 1))` も参照してください。
そして最後に、reddit.comからの5つ星のフィードバックです。
- このサイトが実行されているマザーボードを燃やす必要があります。それはひどいです。
- これは私が今まで見た中で最悪のウェブサイトです。
- 原則として著者には同意しますが、そのウェブサイトは許しがたいです。月曜日にプロジェクトにYAML設定を追加して、あのひどい「ウェブサイト」に意地悪します。
- このウェブサイトは何ですか?そしてなぜ私の電話のキーボードが繰り返しポップアップするのですか?
- このウェブサイトは巨大な編集可能なテキストフィールドです。
- なぜ?
- それは、自分の演説台の上に立ちながら、良い基準を示す良い考えだからです。
- あのウェブサイトの著者は、私たちにプログラミングの方法を教えたいと思っています。
- 私はウェブサイトの精神(くそったれYAML)には同意しますが、著者の設計上の決定は、控えめに言っても疑わしいです。
- 良いニュース(気づきました)は、サイトのすべてのテキストを選択して削除できることです。問題解決です。
- このウェブサイトはくそくらえです。もしこの人がYAMLについて文句を言うのをやめたら、彼のウェブサイトは吹っ飛ばないかもしれません。
- ええ、私は、ウェブサイトがクリックできないハイパーリンクを持つ巨大な編集可能なテキストフィールドである男から、ベストプラクティスに関するアドバイスを受けるつもりはありません。
ps. 設計上、このウェブサイトはYAMLと同じくらい使いやすいです。💕