做网站的公司怎样收费,大良网站建设服务,广州3d建模培训机构,wordpress老文章Terraform 扩展 
Terraform Meta-Arguments 元参数 
count 创建相似的资源for_each 创建相似的资源depends_on 定义资源或者模块的依赖provider 定义provider选项lifecycle 资源的生命周期行为 
参数使用范围备注countresource module适用于创建多个相似的资源#xff0c;使用…Terraform 扩展 
Terraform Meta-Arguments 元参数 
count 创建相似的资源for_each 创建相似的资源depends_on 定义资源或者模块的依赖provider 定义provider选项lifecycle 资源的生命周期行为 
参数使用范围备注countresource module适用于创建多个相似的资源使用索引count.index作为参数引用。如果资源存在区别建议使用 for_eachfor_eachresource modulefor_each 它只能用于set(string) 或者map(string)depends_onresource module处理 Terraform 无法自动推断的资源或模块之间的依赖关系providerresource module在资源中定义供应商通常是 . 模块中如果子模块未定义providers则继承父模块lifecycleresource module生命周期行为定义 
Count 创建资源副本 
count  num数值类型 可以通过 length() 计算数量count.index 索引来遍历列表 
示例 创建三条 DNS 记录 
devops1.evescn.comdevops2.evescn.comdevops3.evescn.com 
Terraform 配置 
## count.tflocals {zone  evescn.comrecords  [devops1,devops2,devops3]
}resource alicloud_dns_record record {count  length(local.records)name         local.zonehost_record  local.records[count.index]type         Avalue        192.168.1.1
} 
## count.tflocals {zone  evescn.comrecords  [devops1,devops2,devops3]
}resource alicloud_dns_record record {count  length(local.records)name         local.zonehost_record  local.records[count.index]type         Avalue        192.168.1.1
} 
创建 DNS 解析 
evescnevescndeMacBook-Pro count % terraform initInitializing the backend...Initializing provider plugins...
- Finding hashicorp/alicloud versions matching 1.164.0...
- Installing hashicorp/alicloud v1.164.0...
- Installed hashicorp/alicloud v1.164.0 (signed by HashiCorp)Terraform has been successfully initialized!evescnevescndeMacBook-Pro count % terraform fmt 
count.tfevescnevescndeMacBook-Pro count % terraform validate
Success! The configuration is valid.evescnevescndeMacBook-Pro count % terraform plan    Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: createTerraform will perform the following actions:# alicloud_dns_record.record[0] will be created resource alicloud_dns_record record { host_record  devops1 id           (known after apply) locked       (known after apply) name         evescn.com routing      default status       (known after apply) ttl          600 type         A value        192.168.1.1}# alicloud_dns_record.record[1] will be created resource alicloud_dns_record record { host_record  devops2 id           (known after apply) locked       (known after apply) name         evescn.com routing      default status       (known after apply) ttl          600 type         A value        192.168.1.1}# alicloud_dns_record.record[2] will be created resource alicloud_dns_record record { host_record  devops3 id           (known after apply) locked       (known after apply) name         evescn.com routing      default status       (known after apply) ttl          600 type         A value        192.168.1.1}Plan: 3 to add, 0 to change, 0 to destroy.evescnevescndeMacBook-Pro count % terraform apply --auto-approveTerraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: createTerraform will perform the following actions:# alicloud_dns_record.record[0] will be created resource alicloud_dns_record record { host_record  devops1 id           (known after apply) locked       (known after apply) name         evescn.com routing      default status       (known after apply) ttl          600 type         A value        192.168.1.1}# alicloud_dns_record.record[1] will be created resource alicloud_dns_record record { host_record  devops2 id           (known after apply) locked       (known after apply) name         evescn.com routing      default status       (known after apply) ttl          600 type         A value        192.168.1.1}# alicloud_dns_record.record[2] will be created resource alicloud_dns_record record { host_record  devops3 id           (known after apply) locked       (known after apply) name         evescn.com routing      default status       (known after apply) ttl          600 type         A value        192.168.1.1}Plan: 3 to add, 0 to change, 0 to destroy.
alicloud_dns_record.record[1]: Creating...
alicloud_dns_record.record[0]: Creating...
alicloud_dns_record.record[2]: Creating...
alicloud_dns_record.record[0]: Creation complete after 1s [id843289465596745728]
alicloud_dns_record.record[1]: Creation complete after 1s [id843289465605112832]
alicloud_dns_record.record[2]: Creation complete after 1s [id843289465619789824]Apply complete! Resources: 3 added, 0 changed, 0 destroyed. 删除 devops2 记录会成功运行 
locals {zone     evescn.com# records  [devops1, devops2, devops3]records  [devops1, devops3]
}resource alicloud_dns_record record {count        length(local.records)name         local.zonehost_record  local.records[count.index]type         Avalue        192.168.1.1
} 执行部署 
evescnevescndeMacBook-Pro count % terraform plan                
alicloud_dns_record.record[0]: Refreshing state... [id843289465596745728]
alicloud_dns_record.record[2]: Refreshing state... [id843289465619789824]
alicloud_dns_record.record[1]: Refreshing state... [id843289465605112832]Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:~ update in-place- destroyTerraform will perform the following actions:# alicloud_dns_record.record[1] will be updated in-place~ resource alicloud_dns_record record {~ host_record  devops2 - devops3id           843289465605112832name         evescn.com# (7 unchanged attributes hidden)}# alicloud_dns_record.record[2] will be destroyed# (because index [2] is out of range for count)- resource alicloud_dns_record record {- host_record  devops3 - null- id           843289465619789824 - null- locked       false - null- name         evescn.com - null- priority     0 - null- routing      default - null- status       ENABLE - null- ttl          600 - null- type         A - null- value        192.168.1.1 - null}Plan: 0 to add, 1 to change, 1 to destroy.evescnevescndeMacBook-Pro count % terraform apply --auto-approve
alicloud_dns_record.record[1]: Refreshing state... [id843289465605112832]
alicloud_dns_record.record[0]: Refreshing state... [id843289465596745728]
alicloud_dns_record.record[2]: Refreshing state... [id843289465619789824]Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:~ update in-place- destroyTerraform will perform the following actions:# alicloud_dns_record.record[1] will be updated in-place~ resource alicloud_dns_record record {~ host_record  devops2 - devops3id           843289465605112832name         evescn.com# (7 unchanged attributes hidden)}# alicloud_dns_record.record[2] will be destroyed# (because index [2] is out of range for count)- resource alicloud_dns_record record {- host_record  devops3 - null- id           843289465619789824 - null- locked       false - null- name         evescn.com - null- priority     0 - null- routing      default - null- status       ENABLE - null- ttl          600 - null- type         A - null- value        192.168.1.1 - null}Plan: 0 to add, 1 to change, 1 to destroy.
alicloud_dns_record.record[2]: Destroying... [id843289465619789824]
alicloud_dns_record.record[1]: Modifying... [id843289465605112832]
alicloud_dns_record.record[2]: Destruction complete after 1s
╷
│ Error: [ERROR] terraform-provider-alicloud/alicloud/resource_alicloud_dns_record.go:138: Resource 843289465605112832 UpdateDomainRecord Failed!!! [SDK alibaba-cloud-sdk-go ERROR]:
│ SDK.ServerError
│ ErrorCode: DomainRecordDuplicate
│ Recommend: https://api.aliyun.com/troubleshoot?qDomainRecordDuplicateproductAlidns
│ RequestId: 17F3D4A1-6E02-5F4E-AEA0-C04C583B9A9E
│ Message: The DNS record already exists.
│ RespHeaders: map[Access-Control-Allow-Origin:[*] Access-Control-Expose-Headers:[*] Connection:[keep-alive] Content-Length:[246] Content-Type:[application/json;charsetutf-8] Date:[Wed, 02 Aug 2023 03:39:11 GMT] Keep-Alive:[timeout25] X-Acs-Request-Id:[17F3D4A1-6E02-5F4E-AEA0-C04C583B9A9E] X-Acs-Trace-Id:[df248ca1dac580f3e90c12bf599c4e1a]]
│ 
│   with alicloud_dns_record.record[1],
│   on count.tf line 7, in resource alicloud_dns_record record:
│    7: resource alicloud_dns_record record {
│  
从 terraform 看程序执行的操作步骤如下 
update server2  server3destroy server3 
但是在执行过程中 count  length(local.records) 命令获取不了 [2] 这个下标程序出错看看 DNS 解析记录 for_each 创建资源副本  for_each  set(string) map(string)  for_each 只能用于 set(string) 或者 map(string)可以使用 toset 转换 list 为 set 数据  for_each  set(string) each.key  each.value for_each  map(string) each.key  keyeach.value  value 
示例 创建三条 DNS 记录 
devops1.evescn.comdevops2.evescn.comdevops3.evescn.com 
Terraform 配置 
## version.tfterraform {required_version  1.1.9required_providers {alicloud  {source   hashicorp/alicloudversion  1.164.0}}
}# Configure the Alicloud Provider
provider alicloud {access_key  xxxxxxxxsecret_key  xxxxxxxx
} 
## for_each.tflocals {zone  evescn.com# records  [devops1, devops2, devops3]records  [devops1, devops3]
}resource alicloud_dns_record eachrecord {for_each     toset(local.records)name         local.zonehost_record  each.valuetype         Avalue        192.168.1.1
} 
创建 DNS 解析 
evescnevescndeMacBook-Pro for_each % terraform initInitializing the backend...Initializing provider plugins...
- Finding hashicorp/alicloud versions matching 1.164.0...
- Installing hashicorp/alicloud v1.164.0...
- Installed hashicorp/alicloud v1.164.0 (signed by HashiCorp)Terraform has been successfully initialized!evescnevescndeMacBook-Pro for_each % terraform fmt 
for_each.tfevescnevescndeMacBook-Pro for_each % terraform validate
Success! The configuration is valid.evescnevescndeMacBook-Pro for_each % terraform apply   Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: createTerraform will perform the following actions:# alicloud_dns_record.eachrecord[devops1] will be created resource alicloud_dns_record eachrecord { host_record  devops1 id           (known after apply) locked       (known after apply) name         evescn.com routing      default status       (known after apply) ttl          600 type         A value        192.168.1.1}# alicloud_dns_record.eachrecord[devops2] will be created resource alicloud_dns_record eachrecord { host_record  devops2 id           (known after apply) locked       (known after apply) name         evescn.com routing      default status       (known after apply) ttl          600 type         A value        192.168.1.1}# alicloud_dns_record.eachrecord[devops3] will be created resource alicloud_dns_record eachrecord { host_record  devops3 id           (known after apply) locked       (known after apply) name         evescn.com routing      default status       (known after apply) ttl          600 type         A value        192.168.1.1}Plan: 3 to add, 0 to change, 0 to destroy.Do you want to perform these actions?Terraform will perform the actions described above.Only yes will be accepted to approve.Enter a value: yesalicloud_dns_record.eachrecord[devops1]: Creating...
alicloud_dns_record.eachrecord[devops2]: Creating...
alicloud_dns_record.eachrecord[devops3]: Creating...
alicloud_dns_record.eachrecord[devops2]: Creation complete after 0s [id843317481926367232]
alicloud_dns_record.eachrecord[devops3]: Creation complete after 0s [id843317481928446976]
alicloud_dns_record.eachrecord[devops1]: Creation complete after 0s [id843317481953598464]Apply complete! Resources: 3 added, 0 changed, 0 destroyed. 删除 devops2 记录重新执行 
## for_each.tflocals {zone  evescn.com# records  [devops1, devops2, devops3]records  [devops1, devops3]
}resource alicloud_dns_record eachrecord {for_each     toset(local.records)name         local.zonehost_record  each.valuetype         Avalue        192.168.1.1
} 执行部署 
evescnevescndeMacBook-Pro for_each % terraform apply
alicloud_dns_record.eachrecord[devops2]: Refreshing state... [id843317481926367232]
alicloud_dns_record.eachrecord[devops3]: Refreshing state... [id843317481928446976]
alicloud_dns_record.eachrecord[devops1]: Refreshing state... [id843317481953598464]Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:- destroyTerraform will perform the following actions:# alicloud_dns_record.eachrecord[devops2] will be destroyed# (because key [devops2] is not in for_each map)- resource alicloud_dns_record eachrecord {- host_record  devops2 - null- id           843317481926367232 - null- locked       false - null- name         evescn.com - null- priority     0 - null- routing      default - null- status       ENABLE - null- ttl          600 - null- type         A - null- value        192.168.1.1 - null}Plan: 0 to add, 0 to change, 1 to destroy.Do you want to perform these actions?Terraform will perform the actions described above.Only yes will be accepted to approve.Enter a value: yesalicloud_dns_record.eachrecord[devops2]: Destroying... [id843317481926367232]
alicloud_dns_record.eachrecord[devops2]: Destruction complete after 0sApply complete! Resources: 0 added, 0 changed, 1 destroyed. dynamic 动态的内联块 
dynamic : 定义动态资源块后面是 label 默认为生成的语句块名称for_each : 要进行迭代循环的对象map、list、set;iterator : 临时的变量名称如果未定义则使用 label 即 ports content : 要生成的语句块的内容部分 
dynamic label {# 支持 map list set 等数据for_each  map | list | set iterator  iterator_namecontent {key  iterator_name.value}
} 
dynamic ports {for_each  local.jenkins_portscontent {internal  ports.value.internalexternal  ports.value.externalip        0.0.0.0protocol  tcp}
} 
Docker 中的 ports{} 
resource docker_container jenkins {ports {internal  8080external  8080ip        0.0.0.0protocol  tcp}ports {internal  50000external  50000ip        0.0.0.0protocol  tcp}
} 
定义一个local变量使用dynamic动态内联块 for_each遍历资源ports.value引用遍历的资源 
locals {jenkins_ports  [{internal  8080external  8080},{internal  50000external  50000}]
}resource docker_container jenkins {// 使用dynamic来实现动态dynamic ports {for_each  local.jenkins_portscontent {internal  ports.value.internalexternal  ports.value.externalip        0.0.0.0protocol  tcp}} 
depends_on 依赖关系 
处理 资源或模块之间的依赖关系。 
resource docker_image jenkins {name          jenkins/jenkins:2.332.2-centos7-jdk8force_remove  falsekeep_locally  true
}resource docker_container jenkins {image       docker_image.jenkins.namename        jenkins-demo# 依赖 docker_image 资源depends_on  [docker_image.jenkins]
} 
provider 自定义供应商 
resource 覆盖资源中的 provider 
例如分别在 cn-beijing 和 cn-shanghai 区域分别创建1个实例。 
provider alicloud {alias   northregion  cn-beijingaccess_key  AKIRsecret_key  MJy5JXmZn
}provider alicloud {region      cn-shanghaiaccess_key  AK5Rsecret_key  MJy5JX6HIqmZn
}resource alicloud_instance ecs_demo_north {provider       alicloud.north...
}resource alicloud_instance ecs_demo {...
} 
module 默认子模块继承根模块的provider 
provider  map()key: provider名称value: provider.alias 
provider alicloud {alias   northregion  cn-beijing
}provider alicloud {region  cn-shanghai
}module example { source  ./example# module 中的 provider 配置providers  { alicloud  alicloud.north}
} 
lifecycle 生命周期 
标记资源不被删除或者销毁前创建新的资源 
lifecycle {xxx
} 
create_before_destroy 先创建新的对象再销毁旧的对象prevent_destroy 防止资源被销毁ignore_changes 忽略资源的差异replace_triggered_by 当指定的资源修改后替换当前资源precondition postcondition 条件检查 
lifecycle {create_before_destroy  true# prevent_destroy  trueignore_changes  [tags, instance_name]replace_triggered_by  [alicloud_vpc.vpc.vpc_name]
}