FluidSynth】FluidSynth 簡介 ( 相關資源鏈接 | 簡介 | 特征 )">【FluidSynth】FluidSynth 簡介 ( 相關資源鏈接 | 簡介 | 特征 )
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" }
`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小時內刪除侵權內容。