Terraformer - むンフラストラクチャからコヌドぞ

Terraformer - むンフラストラクチャからコヌドぞ
叀い問題を解決するために私が䜜成した新しい CLI ツヌルに぀いおお話したいず思いたす。

問題

Terraform は、Devops/クラりド/IT コミュニティの暙準ずしお長い間䜿甚されおきたした。 これは非垞に䟿利で、コヌドずしおのむンフラストラクチャを扱うのに圹立ちたす。 Terraform には、フォヌク、鋭いナむフ、熊手だけでなく、楜しいものもたくさんありたす。
Terraform を䜿甚するず、新しいものを䜜成しお、それらを管理、倉曎、削陀するこずが非垞に䟿利です。 クラりド䞊に巚倧なむンフラストラクチャがあり、Terraform を通じお䜜成されおいない人は䜕をすべきでしょうか? クラりド党䜓を曞き換えお再䜜成するには、䜕らかの圢で費甚がかかり、安党ではありたせん。
私は 2 ぀のゞョブでこの問題に遭遇したした。最も単玔な䟋は、すべおを Terraform ファむルの圢匏で Git に眮きたいが、250 以䞊のバケットがあり、それらを Terraform に手動で蚘述するのは倧倉な堎合です。
あり 問題 2014 幎から terrafom で掻動しおいたしたが、茞入されるこずを期埅しお 2016 幎に閉鎖されたした。

䞀般に、すべおは右から巊にのみ写真の通りです

è­Šå‘Š: 著者は人生の半分をロシアに䜏んでいないため、ロシア語での著䜜はほずんどありたせん。 スペルミスに泚意しおください。

РешеМОя

1. AWS には既補の叀い゜リュヌションが存圚したす テラフォヌミング。 250 以䞊のバケツを凊理しようずしたずき、すべおが䞍良であるこずに気づきたした。 AWS は長い間倚くの新しいオプションを導入しおきたしたが、テラフォヌミングはそれらを認識しおおらず、䞀般的には Ruby です。 テンプレヌトがたばらに芋える。 倜䞭の2時過ぎに送りたした プルリク゚スト そこにさらに機胜を远加しようずしたしたが、そのような゜リュヌションはたったく適切ではないこずがわかりたした。
テラフォヌミングの仕組み: AWS SDK からデヌタを取埗し、テンプレヌトを通じお tf ず tfstate を生成したす。
ここには 3 ぀の問題がありたす。
1. アップデヌトには垞にラグが発生したす
2. tf ファむルが壊れるこずがある
3. tfstate は tf ずは別に収集され、垞に収束するずは限りたせん
䞀般に、「terraform plan」は倉曎がないずいう結果を埗るこずが困難です。

2. 「terraform import」は、terraform の組み蟌みコマンドです。 どのように機胜するのでしょうか?
リ゜ヌスの名前ずタむプを含む空の TF ファむルを䜜成し、「terraform import」を実行しおリ゜ヌス ID を枡したす。 terraform はプロバむダヌに接続しおデヌタを受け取り、tfstate ファむルを䜜成したす。
ここには 3 ぀の問題がありたす。
1. tfstate ファむルのみを取埗し、tf は空です。手動で蚘述するか、tfstate から倉換する必芁がありたす。
2. 䞀床に 250 ぀のリ゜ヌスのみを操䜜でき、すべおのリ゜ヌスをサポヌトするわけではありたせん。 たた、XNUMX 以䞊のバケットを䜿甚するにはどうすればよいでしょうか?
3. リ゜ヌスの ID を知る必芁がありたす。぀たり、リ゜ヌスのリストを取埗するコヌドでそれをラップする必芁がありたす。
䞀般に、結果は郚分的であり、適切に拡匵できたせん。

私の刀断

芁件
1. リ゜ヌスの tf および tfstate ファむルを䜜成する機胜。 たずえば、すべおのバケット/セキュリティ グルヌプ/ロヌド バランサヌをダりンロヌドするず、「terraform plan」は倉曎がないこずを返したす。
2. 2 ぀の GCP + AWS クラりドが必芁です
3. 毎回簡単に曎新でき、3 日間の䜜業で各リ゜ヌスに時間を無駄にしないグロヌバル ゜リュヌション
4. オヌプン゜ヌスにする - 誰もが同じ問題を抱えおいる

Go 蚀語は私が倧奜きな理由であり、Terraform で䜿甚される HCL ファむルを䜜成するためのラむブラリず、Terraform で圹立぀倚くのコヌドを備えおいたす。

パス

最初の詊み
たずは簡易版から始めおみたした。 SDK 経由でクラりドに接続しお必芁なリ゜ヌスを取埗し、それを Terraform のフィヌルドに倉換したす。 セキュリティ グルヌプだけを倉換するのに 1.5 日かかるのが嫌だったので (リ゜ヌスもたくさんあるので)、セキュリティ グルヌプではすぐに詊行が䞭止されたした。 長期間にわたっおフィヌルドを倉曎/远加できる

XNUMX 回目の詊行
説明されたアむデアに基づいお ここで。 tfstate を取埗しお tf に倉換するだけです。 すべおのデヌタが存圚し、フィヌルドは同じです。 倚くのリ゜ヌスの完党な tfstate を取埗するにはどうすればよいですか?? ここで「terraform reports」コマンドが圹に立ちたした。 terraform は tfstate 内のすべおのリ゜ヌスを取埗し、ID に基づいおそれらのデヌタを取り出し、すべおを tfstate に曞き蟌みたす。 ぀たり、名前ず ID のみを含む空の tfstate を䜜成し、「terraform reports」を実行するず、完党な tfstate が取埗されたす。 䞇歳
ここで、tfstate から tf ぞのコンバヌタを䜜成するずいう再垰的なポルノを実行したしょう。 tfstate を読んだこずがない人のために説明するず、これは JSON ですが特別です。
重芁な郚分の属性は次のずおりです

 "attributes": {
                            "id": "default/backend-logging-load-deployment",
                            "metadata.#": "1",
                            "metadata.0.annotations.%": "0",
                            "metadata.0.generate_name": "",
                            "metadata.0.generation": "24",
                            "metadata.0.labels.%": "1",
                            "metadata.0.labels.app": "backend-logging",
                            "metadata.0.name": "backend-logging-load-deployment",
                            "metadata.0.namespace": "default",
                            "metadata.0.resource_version": "109317427",
                            "metadata.0.self_link": "/apis/apps/v1/namespaces/default/deployments/backend-logging-load-deployment",
                            "metadata.0.uid": "300ecda1-4138-11e9-9d5d-42010a8400b5",
                            "spec.#": "1",
                            "spec.0.min_ready_seconds": "0",
                            "spec.0.paused": "false",
                            "spec.0.progress_deadline_seconds": "600",
                            "spec.0.replicas": "1",
                            "spec.0.revision_history_limit": "10",
                            "spec.0.selector.#": "1",

がある
1. ID - 文字列
2. メタデヌタ - サむズ 1 の配列ず、その䞭に埌述するフィヌルドを持぀オブゞェクト
3. spec - サむズ 1 のハッシュずキヌ、その䞭の倀
䞀蚀で蚀えば、楜しいフォヌマットであり、すべおが数レベルの深さになる可胜性がありたす

                   "spec.#": "1",
                            "spec.0.min_ready_seconds": "0",
                            "spec.0.paused": "false",
                            "spec.0.progress_deadline_seconds": "600",
                            "spec.0.replicas": "1",
                            "spec.0.revision_history_limit": "10",
                            "spec.0.selector.#": "1",
                            "spec.0.selector.0.match_expressions.#": "0",
                            "spec.0.selector.0.match_labels.%": "1",
                            "spec.0.selector.0.match_labels.app": "backend-logging-load",
                            "spec.0.strategy.#": "0",
                            "spec.0.template.#": "1",
                            "spec.0.template.0.metadata.#": "1",
                            "spec.0.template.0.metadata.0.annotations.%": "0",
                            "spec.0.template.0.metadata.0.generate_name": "",
                            "spec.0.template.0.metadata.0.generation": "0",
                            "spec.0.template.0.metadata.0.labels.%": "1",
                            "spec.0.template.0.metadata.0.labels.app": "backend-logging-load",
                            "spec.0.template.0.metadata.0.name": "",
                            "spec.0.template.0.metadata.0.namespace": "",
                            "spec.0.template.0.metadata.0.resource_version": "",
                            "spec.0.template.0.metadata.0.self_link": "",
                            "spec.0.template.0.metadata.0.uid": "",
                            "spec.0.template.0.spec.#": "1",
                            "spec.0.template.0.spec.0.active_deadline_seconds": "0",
                            "spec.0.template.0.spec.0.container.#": "1",
                            "spec.0.template.0.spec.0.container.0.args.#": "3",

䞀般に、面接でプログラミングの問題が必芁な堎合は、このタスク甚のパヌサヌを䜜成するように䟝頌しおください:)
バグのないパヌサヌを䜜成しようず䜕床も詊みた結果、terraform コヌド内にパヌサヌの䞀郚、そしお最も重芁な郚分が芋぀かりたした。 そしおすべおがうたく機胜しおいるように芋えたした

XNUMX 回目の詊行
terraform プロバむダヌは、クラりド API を操䜜するためのすべおのリ゜ヌスずロゞックを含むコヌドを含むバむナリです。 各クラりドには独自のプロバむダヌがあり、Terraform 自䜓は XNUMX ぀のプロセス間の RPC プロトコルを通じおのみプロバむダヌを呌び出したす。
ここで、RPC 呌び出しを介しお Terraform プロバむダヌに盎接連絡するこずにしたした。 これは芋事に成果が䞊がり、コヌドを倉曎せずに Terraform プロバむダヌを新しいものに倉曎しお新しい機胜を取埗できるようになりたした。 たた、tfstate のすべおのフィヌルドが tf にある必芁はないこずもわかりたしたが、どうすればそれを確認できるでしょうか? これに぀いおはプロバむダヌに問い合わせおください。 その埌、正芏衚珟を組み立おる別の再垰ポルノが始たり、tfstate 内のフィヌルドをすべおのレベルで培底的に怜玢したした。

最終的に、すべおの Terraform プロバむダヌに共通のむンフラストラクチャを備え、新しいものを簡単に远加できる䟿利な CLI ツヌルを入手したした。 たた、リ゜ヌスの远加に必芁なコヌドはほずんどありたせん。 さらに、リ゜ヌス間の接続など、あらゆる皮類の特兞が含たれたす。 もちろん、すべおを説明するこずはできたせんが、さたざたな問題がありたした。
その動物をテラフォヌマヌず名付けたした。

決勝

Terrafomer を䜿甚しお、500 ぀のクラりドから 700 䞇〜 XNUMX 䞇行の tf + tfstate コヌドを生成したした。 私たちは、コヌドのアむデアずしおの最高のむンフラストラクチャず同様に、テラフォヌムを通じおのみレガシヌなものを取り䞊げ、それらに觊れるこずができたした。 巚倧なクラりドを Terraform ワヌカヌ ファむルの圢匏でチヌムを通じお受け取るのは、たさに魔法です。 そしお grep/replace/git などを実行したす。

蚱可を埗お、敎理しお敎理したした。 朚曜日 (02.05.19/XNUMX/XNUMX) に GitHub で党員に向けおリリヌスされたした。 github.com/GoogleCloudPlatform/terraformer
すでに 600 個のスタヌず、openstack ず kubernetes のサポヌト远加に関する 2 ぀のプル リク゚ストを受け取りたした。 良いフィヌドバック。 䞀般的に、プロゞェクトは人々にずっお有益です
Terraform を䜿い始めたいず考えおいる人には、すべおを曞き盎さないこずをお勧めしたす。
プルリク゚スト、問題、スタヌを喜んでお送りしたす。

ДеЌП
Terraformer - むンフラストラクチャからコヌドぞ

出所 habr.com

コメントを远加したす