4命令部分-代码编写相关命令
terraform 主要使用的就是代码,这里有几个跟代码相关的命令介绍一下
console命令
这个命令可以提供一个交互式,测试很好用
也可以通过echo 传脚本进去
[waooo!!@terraform ~]$ echo 'split(",", "foo,bar,baz")' | terraform console
tolist([
"foo",
"bar",
"baz",
])
console 命令会从state 文件读值, 输出的话直接给地址就行
测试1. 直接进console, (当前已经apply 过了 所以有state文件)
> aws_s3_bucket.bucket.region
"cn-north-1"
测试2 把这个state删了, 就拿不到这个
> aws_s3_bucket.bucket
(known after apply)
测试3 把这个命令加上-plan 可以像plan一样给一些plan出来的值用于调用
[waooo!!@terraform providertest]$ terraform console -plan
> aws_s3_bucket.bucket.region
"cn-north-1"
>
测试4 这里使用console去测试一下带出的结果,这里可以用函数测试
variable "apps" {
type = map(any)
default = {
"foo" = {
"region" = "us-east-1",
},
"bar" = {
"region" = "eu-west-1",
},
"baz" = {
"region" = "ap-south-1",
},
}
}
resource "random_pet" "example" {
for_each = var.apps
}
> { for key, value in var.apps : key => value if value.region == "us-east-1" }
{
"foo" = {
"region" = "us-east-1"
}
}
> random_pet.example
{
"bar" = {
"id" = (known after apply)
"keepers" = tomap(null) /* of string */
"length" = 2
"prefix" = tostring(null)
"separator" = "-"
}
"baz" = {
"id" = (known after apply)
"keepers" = tomap(null) /* of string */
"length" = 2
"prefix" = tostring(null)
"separator" = "-"
}
"foo" = {
"id" = (known after apply)
"keepers" = tomap(null) /* of string */
"length" = 2
"prefix" = tostring(null)
"separator" = "-"
}
}
> cidrnetmask("172.16.0.0/12")
"255.240.0.0"
fmt命令
用于格式化tf文件,通常来讲直接用就行, 有时候希望执行多个目录可以加-recursive参数, 递归格式化
validate命令
这个命令用于验证语法是否合规,如果要验证资源创建逻辑可以用plan命令
使用json模式可以看到一些详细信息,比如:
[ec2-user@ip-10-0-0-34 ec]$ terraform validate -json
{
"format_version": "1.0",
"valid": true,
"error_count": 0,
"warning_count": 0,
"diagnostics": []
}
[ec2-user@ip-10-0-0-34 ec]$
[waooo!!@terraform providertest]$ terraform validate -json
{
"format_version": "1.0",
"valid": false,
"error_count": 1,
"warning_count": 0,
"diagnostics": [
{
"severity": "error",
"summary": "Unsupported argument",
"detail": "An argument named \"buciket\" is not expected here. Did you mean \"bucket\"?",
"range": {
"filename": "s3.tf",
"start": {
"line": 2,
"column": 3,
"byte": 41
},
"end": {
"line": 2,
"column": 10,
"byte": 48
}
},
"snippet": {
"context": "resource \"aws_s3_bucket\" \"felixtest\"",
"code": " buciket = \"felixtftestprovider1\"",
"start_line": 2,
"highlight_start_offset": 2,
"highlight_end_offset": 9,
"values": []
}
}
]
}
[waooo!!@terraform providertest]$ terraform validate
╷
│ Error: Unsupported argument
│
│ on s3.tf line 2, in resource "aws_s3_bucket" "felixtest":
│ 2: buciket = "felixtftestprovider1"
│
│ An argument named "buciket" is not expected here. Did you mean "bucket"?