Terraform 語法簡介

      網友投稿 1922 2022-05-30

      Terraform的配置語言為HCL(HashiCorp Configuration Language),它是HashiCorp發明的一種聲明式語言,能夠以更加簡短和人性化的方式來描述資源。本文主要介紹HCL配置語言的基本語法及使用,語法采用當前最新版本0.12。

      基本組成

      HCL文件以.tf結尾,Terraform執行時會讀取該目錄下所有的HCL文件。由于HCL是聲明式語言,因此對資源和變量的引用不依賴于定義的順序。通常tf文件包含provider,resource和data source,例如下面的代碼創建一個ECS實例:

      provider?"huaweicloud"?{ ????user_name???=?"the?iam?user?name" ????password????=?"xxxxxxxxxxxxx" ????domain_name?=?"the?account?name" ????tenamt_id???=?"project?id" ????region??????=?"cn-north-1" ????auth_url????=?"https://iam.myhwclouds.com:443/v3" } data?"huaweicloud_images_image_v2"?"ubuntu"?{ ??name????????=?"Ubuntu?16.04" ??visibility??=?"public" ??most_recent?=?true } resource?"huaweicloud_ecs_instance_v1"?"server_1"?{ ??name??????????????=?"server_1" ??availability_zone?=?"cn-north-1a" ??image_id??????????=?data.huaweicloud_images_image_v2.ubuntu.id ??flavor????????????=?"s3.medium" ??key_name??????????=?"KeyPair-test" ??vpc_id????????????=?"8eed4fc7-e5e5-44a2-b5f2-23b3e5d46235" ??security_groups???=?["default"] ??nics?{ ????network_id?=?"55534eaa-533a-419d-9b40-ec427ea7195a" ??} }

      provider對應一個云廠商的基礎設施,它提供了云廠商對應的resource和data source。使用provider需要設置對應的密鑰、地區等,這些參數名稱可以在各個云廠商的插件文檔中找到,比如華為云的文檔在這里。執行`terraform init`時會根據provider來下載需要使用的插件,默認會從terraform官方倉庫下載最新版本的插件,也可以在provider中使用`version`來指定版本。

      resource是Teraform中最重要的組成元素,每個resource塊代表一個云服務實例,如ECS、VPC等實例。

      data source用來查詢一些信息給其他的resource配置使用,比如上面通過data source查詢ubuntu的公共鏡像的ID,然后在ECS實例中引用它。

      配置語法

      Terraform 語法是圍繞參數和塊結構構建的。

      參數(Argument)

      image_id?=?"abc123"

      參數將一個值或表達式賦給指定的參數名稱,等號前的標識符是參數名稱,等號后的表達式是參數的值。

      塊(Block)

      resource?"aws_instance"?"example"?{ ??ami?=?"abc123" ??network_interface?{ ????#?... ??} }

      塊是參數的容器,由塊類型,標簽和塊主體構成。塊主體在塊類型關鍵字和標簽之后定義,由`{`和`}`字符分隔。在塊主體內,可以嵌套其他塊類型以實現不同的層級結構。

      塊標簽的數量由塊類型關鍵字值決定。上面例子中的resource塊類型包含兩個標簽:`aws_instance`和`example`。嵌套的`network_interface`塊類型,可以不需要任何標簽。

      注釋

      Terraform 支持單行注釋和多行注釋:

      單行注釋以`#`或者`//`開始,在行尾結束。`#`是單行注釋的默認風格;

      多行注釋以`/*`開始,以`*/`結束;

      樣式約定

      Terraform有一些慣用的樣式約定,建議用戶遵循這些約定,以確保不同團隊編寫的文件和模塊之間的一致性。

      每個嵌套級別縮進兩個空格;

      當多個單行的參數在同一嵌套級別連續出現時,建議將等號對齊:

      name??????????????=?"abc123" availability_zone?=?"cn-north-1a"

      當塊主體同時包含參數和塊時,建議將所有參數放在頂部,嵌套塊放在參數的下面并用空行隔開;

      使用空行分隔塊中的邏輯參數組。

      當塊主體同時包含參數和”元參數“(meta-arguments)時,建議先列出元參數,并用空行將它們與其他參數隔開。將元參數塊放在最后,并用空行將他們與其他塊分開。

      resource?"aws_instance"?"example"?{ ??count?=?2?#?meta-argument?first ??ami???????????=?"abc123" ??instance_type?=?"t2.micro" ??network_interface?{ ????#?... ??} ??lifecycle?{?#?meta-argument?block?last ????create_before_destroy?=?true ??} }

      頂層塊應始終用空行將彼此隔開。具有相同類型的嵌套塊可以放在一起,不同類型的嵌套的塊建議用空行隔開。

      避免將相同類型的多個塊與其他不同類型的塊分開。

      類型

      基本類型

      `string`:字符串類型,由一個或多個Unicode字符組成,例如"hello"。

      `number`: 數字類型,可以表示整數,也可以表示浮點數。

      `bool`:布爾類型,只能是`true`或`false`。

      數字類型和布爾類型在配置中都可以自動轉換為字符串類型,相反,只要字符串值能代表有效的數字或布爾類型,都可以自動轉換。比如:

      `true`可以轉換為字符串`"true"`,`"true"`也可以轉換為`true`。

      `15`可以轉換為字符串`"15"`,`"15"`也可以轉換為數字`15`。

      復合類型

      復合類型分為兩類:集合類型(元素類型相同)和結構類型(元素類型可以不同)

      集合類型

      `list(...)`:列表類型,它的所有元素類型必須是**相同類型**,索引從0開始。當tf文件中表示對象的列表時寫法為

      data_disks?{ ??type?=?"SATA" ??size?=?"100" } data_disks?{ ??type?=?"SAS" ??size?=?"200" }

      Terraform 語法簡介

      `map(...)`: 包含多個`key: value`形式。在tf文件中的寫法為

      tags?=?{ ????test?=?"test1" }

      `set(...)`:不具有任何輔助標識符或者索引的集合,集合中的元素值。

      結構類型

      `object(...)`:對象中的每個元素可以有各自的類型,其語法可以表示為`{ = , = , ... }`。

      `tuple(...)`:元組是從零開始標識的元素序列,其中每個元素都有自己的類型。其語法可以表示為`[, , ...]`

      特殊類型

      `null`:表示空,如果將一個參數設置為null,表示這個參數未填寫,Terraform會完全忽略這個參數。null在條件表達式中比較有用,比如當 var.test 的值為""忽略該字段可以這樣寫:`name = var.test == "" ? null : var.test`

      變量引用

      Terraform中resource和data source之間通常會引用屬性值,引用方式如下:

      引用resource屬性:可以直接引用resource屬性,比如引用上面示例中ecs的id,`huaweicloud_ecs_instance_v1.server_1.id`。

      引用data source屬性:可以使用`data.`引用data source屬性,比如引用上面實例中鏡像的id, `data.huaweicloud_images_image_v2.ubuntu.id`

      當創建多個實例時,resource中的count不為1,可以使用`count.index`引用實例的索引

      引用對象列表的所有的name可以使用`huaweicloud_ecs_instance_v1.server_1.data_disks[*].size`表示ecs的所有data_disks的size所組成的列表

      表達式

      運算符

      terraform支持的運算符包括:

      算術運算符: `+`, `-`, `*`, `/`, `%`, `-a`

      比較運算符: `==`, `!=`, `<` , `<=`, `>`, `>=`

      邏輯運算符: `||`, `&&`, `!a`

      條件表達式

      terraform支持條件表達式,表示如果條件為真,結果時true_val, 否則結果為false_val。

      condition???true_val?:?false_val

      總結

      以上就是terraform的基本使用語法,更多使用例子可以參考這里。

      參考資料

      https://www.terraform.io/docs/configuration/syntax.html

      https://www.terraform.io/docs/configuration/style.html

      https://www.terraform.io/docs/configuration/types.html

      https://cloud.tencent.com/developer/article/1600047

      容器 彈性云服務器 ECS

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:技術分享 | Web測試方法與技術之CSS講解
      下一篇:技術人如何搭建自己的技術博客
      相關文章
      亚洲免费在线视频| 亚洲国产91精品无码专区| 亚洲无人区午夜福利码高清完整版| 亚洲av无一区二区三区| 亚洲综合色丁香婷婷六月图片| 亚洲人成777在线播放| 亚洲性无码av在线| 亚洲女人18毛片水真多| 亚洲欧洲国产经精品香蕉网| 911精品国产亚洲日本美国韩国| 内射少妇36P亚洲区| 亚洲视频免费在线播放| 亚洲综合免费视频| 亚洲人成网站日本片| 爱情岛亚洲论坛在线观看| 亚洲国产第一页www| 久久精品国产亚洲AV麻豆不卡| 亚洲AV无码久久精品狠狠爱浪潮| 亚洲国产精彩中文乱码AV| 亚洲AV天天做在线观看| 亚洲黑人嫩小videos| 亚洲国产精品成人综合久久久 | 亚洲香蕉久久一区二区三区四区| 欧洲亚洲国产清在高| 亚洲国产精品一区第二页 | 亚洲av午夜精品无码专区| 亚洲国产成人精品青青草原| 色偷偷亚洲女人天堂观看欧| 亚洲综合成人婷婷五月网址| 亚洲第一成年网站视频| 亚洲AV网一区二区三区| 亚洲精品成a人在线观看| 亚洲人AV永久一区二区三区久久| 自拍偷自拍亚洲精品第1页| 亚洲成AV人片在线观看| 亚洲黄色在线视频| 国产.亚洲.欧洲在线| 亚洲a无码综合a国产av中文| 区久久AAA片69亚洲| 婷婷精品国产亚洲AV麻豆不片| 亚洲欧洲高清有无|