国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

我花兩周拆解Terraform的JSON輸出,發(fā)現(xiàn)這些文檔沒寫的坑

0
分享至

  大多數(shù)運(yùn)維工程師運(yùn)行過(guò)成千上萬(wàn)次terraform plan,但幾乎沒人看過(guò)加上-json標(biāo)志后輸出的內(nèi)容。我在開發(fā)開源漂移檢測(cè)工具tfdrift時(shí),花了兩周時(shí)間鉆進(jìn)這份JSON輸出。結(jié)果發(fā)現(xiàn)它結(jié)構(gòu)清晰得令人意外,但也藏著幾處文檔里找不到的陷阱。

  如果你正在基于Terraform構(gòu)建任何工具——漂移檢測(cè)、策略執(zhí)行、成本估算、變更分析——這篇技術(shù)深潛就是我當(dāng)時(shí)希望有人寫給我的指南。

  

  獲取JSON輸出的正確姿勢(shì)

  

  首先,基礎(chǔ)操作。你不能直接管道terraform plan得到JSON。文本輸出和JSON輸出是完全不同的代碼路徑,必須分兩步走:

  # 第一步:生成計(jì)劃文件terraform plan -out=tfplan -input=false -no-color# 第二步:轉(zhuǎn)換為JSONterraform show -json tfplan

  -out標(biāo)志把計(jì)劃保存為二進(jìn)制文件(人類不可讀),terraform show -json再把它轉(zhuǎn)成結(jié)構(gòu)化JSON。第一步不能跳過(guò)——沒有terraform plan -json這種直接輸出JSON到stdout的標(biāo)志。這點(diǎn)最初讓我栽了跟頭。

  Python里這樣實(shí)現(xiàn):

  import subprocessimport jsondef get_plan_json(workspace_path: str) -> dict:# 生成計(jì)劃文件subprocess.run(["terraform", "plan", "-out=tfplan","-input=false", "-no-color"],cwd=workspace_path,capture_output=True,text=True,timeout=600,# 轉(zhuǎn)換為JSONresult = subprocess.run(["terraform", "show", "-json", "tfplan"],cwd=workspace_path,capture_output=True,text=True,timeout=120,return json.loads(result.stdout)

  注意幾個(gè)細(xì)節(jié)。plan的超時(shí)設(shè)為10分鐘——大型工作空間資源多,plan需要刷新狀態(tài)并調(diào)用云廠商API,耗時(shí)可能很長(zhǎng)。show的超時(shí)更短,因?yàn)樗皇亲x取本地文件。另外必須加-input=false,因?yàn)槲覀円苑墙换ツJ竭\(yùn)行——不加的話,Terraform可能掛起等待用戶輸入。

  plan JSON的結(jié)構(gòu)

  JSON輸出字段很多,但對(duì)漂移檢測(cè)來(lái)說(shuō),真正重要的只有一個(gè):resource_changes。簡(jiǎn)化版長(zhǎng)這樣:

  {"format_version": "1.2","terraform_version": "1.7.0","resource_changes": ["address": "aws_security_group.api_sg","mode": "managed","type": "aws_security_group","name": "api_sg","provider_name": "registry.terraform.io/hashicorp/aws","change": {"actions": ["update"],"before": {"ingress": ["from_port": 443,"to_port": 443,"cidr_blocks": ["10.0.0.0/8"]],"tags": {"Name": "api-sg"}},"after": {"ingress": ["from_port": 443,"to_port": 443,"cidr_blocks": ["10.0.0.0/8"]},"from_port": 22,"to_port": 22,"cidr_blocks": ["0.0.0.0/0"]],"tags": {"Name": "api-sg"}},"after_sensitive": {},"after_unknown": {}}

  resource_changes里的每個(gè)條目代表Terraform想要修改的一個(gè)資源。change對(duì)象包含四個(gè)關(guān)鍵部分:

  actions:一個(gè)數(shù)組,描述Terraform要對(duì)資源做什么??赡艿闹蛋?code>["no-op"](無(wú)變更)、["create"]、["update"]["delete"],以及組合如["delete", "create"](銷毀后重建)。

  before:資源的當(dāng)前狀態(tài),直接從狀態(tài)文件讀取。

  after:資源執(zhí)行計(jì)劃后的預(yù)期狀態(tài)。

  after_unknown:執(zhí)行后才能確定的值,比如新創(chuàng)建資源的ID。

  

  那些文檔沒寫的坑

  第一,敏感值的處理。after_sensitive標(biāo)記哪些字段包含敏感數(shù)據(jù),但它只告訴你字段名,不告訴你值在哪里。實(shí)際值被替換成true,你得自己遞歸遍歷after對(duì)象來(lái)定位。更麻煩的是,敏感標(biāo)記可能出現(xiàn)在嵌套結(jié)構(gòu)的任意層級(jí)。

  第二,after_unknown的結(jié)構(gòu)與after不完全一致。有時(shí)候after里有個(gè)字段,after_unknown里對(duì)應(yīng)位置卻是true,表示整個(gè)字段未知;有時(shí)候是部分未知,比如列表里的某些元素。解析時(shí)必須同時(shí)處理布爾值和嵌套對(duì)象兩種情況。

  第三,資源地址的解析。address字段看起來(lái)簡(jiǎn)單,比如aws_security_group.api_sg,但模塊嵌套時(shí)變成module.vpc.aws_security_group.api_sg,甚至module.vpc.module.subnet.aws_security_group.api_sg。沒有內(nèi)置的分隔方法,只能按點(diǎn)號(hào)分割后手動(dòng)識(shí)別哪些是模塊前綴、哪些是實(shí)際資源。

  第四,no-op動(dòng)作的噪音。即使資源沒有任何變更,只要被引用或依賴,也可能出現(xiàn)在resource_changes里,actions["no-op"]。過(guò)濾掉這些條目能顯著減少后續(xù)處理的負(fù)擔(dān)。

  從JSON到漂移檢測(cè)

  tfdrift的核心邏輯其實(shí)不復(fù)雜:定期運(yùn)行上述流程,把resource_changes持久化,對(duì)比歷史記錄識(shí)別意外變更。真正的工程挑戰(zhàn)在于:

  1. 大規(guī)模工作空間的性能——超時(shí)策略、并發(fā)控制、狀態(tài)緩存

  2. 變更的語(yǔ)義理解——同樣是update,改標(biāo)簽和改安全組規(guī)則的風(fēng)險(xiǎn)等級(jí)完全不同

  3. 噪聲過(guò)濾——自動(dòng)識(shí)別由正常部署引起的預(yù)期變更,只告警真正的漂移

  JSON解析只是起點(diǎn)。但如果沒有吃透這份輸出的結(jié)構(gòu)和邊界情況,后續(xù)所有功能都建在沙地上。

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
王皓豪賭收奇效,國(guó)乒男團(tuán)橫掃奪冠,張本豪言最強(qiáng)日乒成大笑話

王皓豪賭收奇效,國(guó)乒男團(tuán)橫掃奪冠,張本豪言最強(qiáng)日乒成大笑話

劉剮說(shuō)體壇
2026-05-11 03:20:09
拉什福德任意球破門,巴塞羅那2:0皇家馬德里提前三輪奪冠

拉什福德任意球破門,巴塞羅那2:0皇家馬德里提前三輪奪冠

本澤體育
2026-05-11 04:56:49
馬爾蒂尼評(píng)皇馬:“這絕對(duì)是一場(chǎng)災(zāi)難”

馬爾蒂尼評(píng)皇馬:“這絕對(duì)是一場(chǎng)災(zāi)難”

綠茵情報(bào)局
2026-05-11 02:55:05
中介不小心說(shuō)漏嘴:大部分二手房都不值得買,4個(gè)原因很現(xiàn)實(shí)

中介不小心說(shuō)漏嘴:大部分二手房都不值得買,4個(gè)原因很現(xiàn)實(shí)

阿離家居
2026-05-10 20:28:44
裁判最低分!李國(guó)旭倒數(shù)第三!大連全隊(duì)打分:雙煞最高 3將不及格

裁判最低分!李國(guó)旭倒數(shù)第三!大連全隊(duì)打分:雙煞最高 3將不及格

刀鋒體育
2026-05-10 23:32:58
武漢地鐵站外,女子一把拔下別人的電動(dòng)車鑰匙!網(wǎng)友:這是1個(gè)笨蛋和0個(gè)壞人的故事

武漢地鐵站外,女子一把拔下別人的電動(dòng)車鑰匙!網(wǎng)友:這是1個(gè)笨蛋和0個(gè)壞人的故事

環(huán)球網(wǎng)資訊
2026-05-10 20:55:21
特朗普舉著孩子照片,對(duì)哭泣的母親承諾:我相信中國(guó)會(huì)執(zhí)行死刑的

特朗普舉著孩子照片,對(duì)哭泣的母親承諾:我相信中國(guó)會(huì)執(zhí)行死刑的

博覽歷史
2025-07-21 17:59:30
1958年毛澤東視察濟(jì)南,酒桌上突然猛砸杯子死盯王新亭:把你隱瞞的秘密交底吧?

1958年毛澤東視察濟(jì)南,酒桌上突然猛砸杯子死盯王新亭:把你隱瞞的秘密交底吧?

史海孤雁
2026-05-05 17:07:19
把瑜伽褲穿成日常的松弛感美女

把瑜伽褲穿成日常的松弛感美女

只要高興就好
2026-04-13 14:30:30
水土不服!曼城6000萬(wàn)“災(zāi)星”或轉(zhuǎn)投米蘭!曼聯(lián)“強(qiáng)追”頂級(jí)中場(chǎng)

水土不服!曼城6000萬(wàn)“災(zāi)星”或轉(zhuǎn)投米蘭!曼聯(lián)“強(qiáng)追”頂級(jí)中場(chǎng)

頭狼追球
2026-05-10 13:54:26
《比弗利嬌妻》女星宣布暫停求子:?jiǎn)逝磁c婚姻破裂讓她"太害怕"

《比弗利嬌妻》女星宣布暫停求子:?jiǎn)逝磁c婚姻破裂讓她"太害怕"

娛圈觀察員
2026-05-10 04:38:52
朝鮮導(dǎo)游懵了:這么貴的水果,為什么中國(guó)游客卻舍得買?

朝鮮導(dǎo)游懵了:這么貴的水果,為什么中國(guó)游客卻舍得買?

老特有話說(shuō)
2026-05-05 15:23:38
Nice!杜蘭特點(diǎn)贊!勇士第一筆重磅簽約

Nice!杜蘭特點(diǎn)贊!勇士第一筆重磅簽約

籃球?qū)崙?zhàn)寶典
2026-05-10 19:42:35
不露面不知道,一露面嚇一跳,這些明星怎么都老成這個(gè)樣子了

不露面不知道,一露面嚇一跳,這些明星怎么都老成這個(gè)樣子了

孤城落日
2026-04-20 19:26:14
世界正在發(fā)生一個(gè)極其惡心的變化!印度最終可能會(huì)成為地球大患

世界正在發(fā)生一個(gè)極其惡心的變化!印度最終可能會(huì)成為地球大患

世界圈
2026-05-04 16:42:27
央八新劇來(lái)襲!混子演員當(dāng)女主,眼神空洞肌無(wú)力,未開播就遭人嫌

央八新劇來(lái)襲!混子演員當(dāng)女主,眼神空洞肌無(wú)力,未開播就遭人嫌

一娛三分地
2026-05-08 17:16:13
100 日元兌 4.33 元:日本用三十年,把自己熬成了 “廉價(jià)國(guó)家”

100 日元兌 4.33 元:日本用三十年,把自己熬成了 “廉價(jià)國(guó)家”

深析古今
2026-03-31 10:10:57
王楚欽被表白了?女神身份曝光,18歲,長(zhǎng)相甜美,孫穎莎一句話耐人尋味

王楚欽被表白了?女神身份曝光,18歲,長(zhǎng)相甜美,孫穎莎一句話耐人尋味

乒乓網(wǎng)國(guó)球匯
2026-01-31 00:11:25
向美軍開火,美國(guó)輸了個(gè)底朝天,特朗普緊急表態(tài),伊朗瘋了

向美軍開火,美國(guó)輸了個(gè)底朝天,特朗普緊急表態(tài),伊朗瘋了

軍科零零
2026-05-11 03:04:22
16歲女孩景區(qū)內(nèi)墜亡,目擊者發(fā)聲,賠償金額曝光,景區(qū)運(yùn)營(yíng)僅49天

16歲女孩景區(qū)內(nèi)墜亡,目擊者發(fā)聲,賠償金額曝光,景區(qū)運(yùn)營(yíng)僅49天

溫柔看世界
2026-05-06 11:48:44
2026-05-11 06:36:49
灰度測(cè)試中
灰度測(cè)試中
生活正在重構(gòu),目前還在灰度測(cè)試階段,暫不全量發(fā)布。
2411文章數(shù) 24關(guān)注度
往期回顧 全部

科技要聞

DeepSeek融資,改寫所有人的估值

頭條要聞

王楚欽助男乒12連冠+生日捧杯:球迷陪伴是最好禮物

頭條要聞

王楚欽助男乒12連冠+生日捧杯:球迷陪伴是最好禮物

體育要聞

那個(gè)曾讓詹姆斯抱頭的兄弟,40歲從大學(xué)畢業(yè)了

娛樂要聞

趙露思老實(shí)人豁出去了 沒舞蹈天賦硬跳

財(cái)經(jīng)要聞

白酒大逃殺

汽車要聞

軸距加長(zhǎng)/智駕拉滿 阿維塔07L定位大五座SUV

態(tài)度原創(chuàng)

教育
健康
親子
手機(jī)
數(shù)碼

教育要聞

男孩為了拼中考體育滿分,每天堅(jiān)持猛跑1小時(shí),卻把骨頭跑斷了

干細(xì)胞能讓人“返老還童”嗎

親子要聞

從第一聲呼喚開始,愛就有了名字

手機(jī)要聞

OPPO Reno16系列參數(shù)全曝光,就差價(jià)格了

數(shù)碼要聞

你昂貴的DDR5內(nèi)存可能是假貨:穿著三星的馬甲 心里卻是SK海力士

無(wú)障礙瀏覽 進(jìn)入關(guān)懷版