F5Networks/terraform-azure-bigip-module

GitHub: F5Networks/terraform-azure-bigip-module

该模块用于通过 Terraform 在 Azure 云中自动化部署和配置多网卡、多实例的 F5 BIG-IP。

Stars: 10 | Forks: 28

# 在 Azure 云中部署 BIG-IP 此 Terraform 模块在 Azure 云中部署 N 网卡(N-nic)的 F5 BIG-IP,并通过模块 count 特性,我们还可以部署多个 BIG-IP 实例。 [![发布版本](https://img.shields.io/github/release/f5networks/terraform-azure-bigip-module.svg)](https://github.com/f5networks/terraform-azure-bigip-module/releases) [![问题](https://img.shields.io/github/issues/f5networks/terraform-azure-bigip-module.svg)](https://github.com/f5networks/terraform-azure-bigip-module/issues) ## 前置条件 此模块从 Terraform 0.13 版本开始支持。 以下模板已在以下版本中测试并正常运行 Terraform v0.14.0 + provider registry.terraform.io/hashicorp/azurerm v2.28.0 + provider registry.terraform.io/hashicorp/null v2.1.2 + provider registry.terraform.io/hashicorp/random v2.3.0 + provider registry.terraform.io/hashicorp/template v2.1.2 !> **注意:** bigip-module v1.2.0 要求 azurerm > 3.0 版本 ## 发布与版本管理 此模块支持以下 bigip 和 terraform 版本 | BIGIP 版本 | Terraform 1.X | Terraform 0.14 | |---------------|----------------|----------------| | BIG-IP 17.x | X | X | | BIG-IP 16.x | X | X | | BIG-IP 15.x | X | X | ## 密码管理 |:point_up: |默认情况下,bigip 模块将进行随机密码设置,以实现动态密码生成| |----|---| |:point_up: |用户可以使用可选变量 "f5_password" 显式提供密码作为模块的输入| |----|---| |:point_up: | 要使用 Azure key vault 密码,我们必须将变量 "az_keyvault_authentication" 启用为 true,并提供定义了 azure key vault 的 key_valut 名称、密钥以及资源组名称变量| |-----|----| ## 弃用 + `azurerm_public_ip` 资源中的 zones 变量已弃用,由新变量 `availability_zones` 替代。因此,我们需要为模块在 public_ip 资源中的区域分配引入新的输入变量,以下是针对该变量的新配置。我们已据此更新了示例。 variable availabilityZones_public_ip { description = "The availability zone to allocate the Public IP in. Possible values are Zone-Redundant, 1, 2, 3, and No-Zone." type = string default = "Zone-Redundant" } ## BYOL 许可 此模板(默认)使用 PayGo BIG-IP 镜像进行部署。如果您想使用 BYOL 许可证,则需要执行以下步骤: + 使用 Azure CLI 查找 SKU 名称中带有 *BYOL* 的可用镜像/版本: > az vm image list -f BIG-IP --all # 示例输出... { "offer": "f5-big-ip-byol", "publisher": "f5-networks", "sku": "f5-big-ltm-2slot-byol", "urn": "f5-networks:f5-big-ip-byol:f5-big-ltm-2slot-byol:15.1.201000", "version": "15.1.201000" }, + 在 `variables.tf` 中,使用 AZ CLI 结果中的 SKU 和 offer 修改 `image_name` 和 `product_name` # BIGIP 镜像 variable product_name { default = "f5-big-ip-byol" } variable image_name { default = "f5-big-ltm-2slot-byol" } + 在 DO 声明(Declarative Onboarding)中添加相应的许可证密钥,此 DO 可以添加到自定义的 run-time-int 脚本中(如示例部分所示),或者按照提供的 URL POST 一个 Declarative Onboarding 声明。 ( ) "myLicense": { "class": "License", "licenseType": "regKey", "regKey": "${regKey}" }, ## 自定义 User data + 默认情况下,`custom_user_data` 将为 `null`,bigip 模块将使用默认的 `f5_onboard.tmpl` 文件内容进行初始的 BIGIP 引导配置。 + 如果用户需要自定义引导配置,我们可以使用此变量并将自定义脚本的内容传递给该变量,以实现自定义的 bigip 引导配置。(示例部分提供了一个示例) ### 使用 `custom_user_data` 的 3-NIC 部署模块示例 ``` module bigip { source = "F5Networks/bigip-module/azure" prefix = "bigip-azure-3nic" resource_group_name = "testbigip" mgmt_subnet_ids = [{"subnet_id" = "subnet_id_mgmt" , "public_ip" = true, "private_ip_primary" = ""}] mgmt_securitygroup_ids = ["securitygroup_id_mgmt"] external_subnet_ids = [{"subnet_id" = "subnet_id_external", "public_ip" = true, "private_ip_primary" = "", "private_ip_secondary" = "" }] external_securitygroup_ids = ["securitygroup_id_external"] internal_subnet_ids = [{"subnet_id" = "subnet_id_internal", "public_ip"=false, "private_ip_primary" = "" }] internal_securitygroup_ids = ["securitygropu_id_internal"] availabilityZones = var.availabilityZones availabilityZones_public_ip = var.availabilityZones_public_ip custom_user_data = var.custom_user_data } ``` ## 示例用法 + 我们提供了一些常见的部署[示例](https://github.com/F5Networks/terraform-azure-bigip-module/tree/main/examples) !> **注意:** subnet_ids 和 securitygroup_ids 之间必须存在一对一的映射(例如,如果我们有 2 个或更多的外部 subnet_ids,我们就必须向模块提供同等数量的外部 securitygroup_ids) !> **注意:** 用户可以使用动态或静态的私有 IP 分配。如果 primary/secondary 私有 IP 值为 null,则将为动态分配;否则将为静态私有 IP 分配。 !> **注意:** 通过静态私有 IP 分配,我们可以为外部接口分配 primary 和 secondary 私有 IP,而 management 和内部接口只能分配 primary 私有 IP。 ~> **警告** 如果是静态私有 IP 分配,我们将无法使用模块的 count 特性,因为基于模块的 count 数量,系统会尝试为多个 bigip 实例分配相同的私有 IP。 ~> **警告** 通过动态私有 IP 分配,我们必须向 primary/secondary 私有 IP 声明传递 null 值,并且支持模块 count 特性。 !> **注意:** 有时可以观察到给定的静态 primary 和 secondary 私有 IP 可能会发生互换。这是 aws 中存在的限制。 ~>**注意:** 此模块使用基础的 [DO](https://github.com/F5Networks/terraform-azure-bigip-module/blob/main/config/onboard_do.json) 配置,在 runtime-init 过程中设置用户和密码,它不配置 VLANS/SelfIPs 及其他配置。 ~>**注意:** 如果您正在使用自定义的 ATC 工具,请不要更改 ATC 工具 rpm 文件的名称(例如:f5-declarative-onboarding-xxxx.noarch.rpm, f5-appsvcs-xxx.noarch.rpm) ### 以下示例代码片段展示了如何调用此模块。(动态私有 IP 分配) ``` # 示例 1-NIC Deployment Module 用法 # module bigip { source = "F5Networks/bigip-module/azure" prefix = "bigip-azure-1nic" resource_group_name = "testbigip" mgmt_subnet_ids = [{"subnet_id" = "subnet_id_mgmt" , "public_ip" = true,"private_ip_primary" = ""}] mgmt_securitygroup_ids = ["securitygroup_id_mgmt"] availabilityZones = var.availabilityZones availabilityZones_public_ip = var.availabilityZones_public_ip } # 示例 2-NIC Deployment Module 用法 # module bigip { source = "F5Networks/bigip-module/azure" prefix = "bigip-azure-2nic" resource_group_name = "testbigip" mgmt_subnet_ids = [{"subnet_id" = "subnet_id_mgmt" , "public_ip" = true, "private_ip_primary" = ""}] mgmt_securitygroup_ids = ["securitygroup_id_mgmt"] external_subnet_ids = [{"subnet_id" = "subnet_id_external", "public_ip" = true,"private_ip_primary" = "", "private_ip_secondary" = "" }] external_securitygroup_ids = ["securitygroup_id_external"] availabilityZones = var.availabilityZones availabilityZones_public_ip = var.availabilityZones_public_ip } # 示例 3-NIC Deployment Module 用法 # module bigip { source = "F5Networks/bigip-module/azure" prefix = "bigip-azure-3nic" resource_group_name = "testbigip" mgmt_subnet_ids = [{"subnet_id" = "subnet_id_mgmt" , "public_ip" = true, "private_ip_primary" = ""}] mgmt_securitygroup_ids = ["securitygroup_id_mgmt"] external_subnet_ids = [{"subnet_id" = "subnet_id_external", "public_ip" = true, "private_ip_primary" = "", "private_ip_secondary" = "" }] external_securitygroup_ids = ["securitygroup_id_external"] internal_subnet_ids = [{"subnet_id" = "subnet_id_internal", "public_ip"=false, "private_ip_primary" = "" }] internal_securitygroup_ids = ["securitygropu_id_internal"] availabilityZones = var.availabilityZones availabilityZones_public_ip = var.availabilityZones_public_ip } # 示例 4-NIC Deployment Module 用法(包含 2 个外部公共接口,一个管理接口和一个内部接口。subnet_ids 和 securitygroupids 之间应存在一一映射) # module bigip { source = "F5Networks/bigip-module/azure" prefix = "bigip-azure-4nic" resource_group_name = "testbigip" mgmt_subnet_ids = [{"subnet_id" = "subnet_id_mgmt" , "public_ip" = true, "private_ip_primary" = ""}] mgmt_securitygroup_ids = ["securitygroup_id_mgmt"] external_subnet_ids = [{"subnet_id" = "subnet_id_external", public_ip" = true, "private_ip_primary" = "", "private_ip_secondary" = "" },{"subnet_id" = subnet_id_external2", public_ip" = true, "private_ip_primary" = "", "private_ip_secondary" = "" }] external_securitygroup_ids = ["securitygroup_id_external","securitygroup_id_external"] internal_subnet_ids = [{"subnet_id" = "subnet_id_internal", "public_ip"=false, "private_ip_primary" = "" }] internal_securitygroup_ids = ["securitygropu_id_internal"] availabilityZones = var.availabilityZones availabilityZones_public_ip = var.availabilityZones_public_ip } # 使用带有 module count 功能的 Module 部署 2 BIGIP-1 Nics 的示例 # module bigip { count = 2 source = "F5Networks/bigip-module/azure" prefix = "bigip-azure-1nic" resource_group_name = "testbigip" mgmt_subnet_ids = [{"subnet_id" = "subnet_id_mgmt" , "public_ip" = true,"private_ip_primary" = ""}] mgmt_securitygroup_ids = ["securitygroup_id_mgmt"] availabilityZones = var.availabilityZones availabilityZones_public_ip = var.availabilityZones_public_ip } ``` + 类似地,基于用户提供的 subnet_ids 和 securitygroup_ids,我们可以进行 N 网卡部署。 + 通过模块 count,用户可以在 azure 云中部署多个 bigip 实例(count 的默认值为 1) #### 以下是私有 IP 分配的示例代码片段 ``` # 示例 3-NIC Deployment 与静态私有 ip 分配 # module bigip { source = "F5Networks/bigip-module/azure" prefix = format("%s-3nic", var.prefix) resource_group_name = azurerm_resource_group.rg.name mgmt_subnet_ids = [{ "subnet_id" = data.azurerm_subnet.mgmt.id, "public_ip" = true, "private_ip_primary" = "10.2.1.5"}] mgmt_securitygroup_ids = [module.mgmt-network-security-group.network_security_group_id] external_subnet_ids = [{ "subnet_id" = data.azurerm_subnet.external-public.id, "public_ip" = true, "private_ip_primary" = "10.2.2.40","private_ip_secondary" = "10.2.2.50" }] external_securitygroup_ids = [module.external-network-security-group-public.network_security_group_id] internal_subnet_ids = [{ "subnet_id" = data.azurerm_subnet.internal.id, "public_ip" = false, "private_ip_primary" = "10.2.3.40"}] internal_securitygroup_ids = [module.internal-network-security-group.network_security_group_id] availabilityZones = var.availabilityZones availabilityZones_public_ip = var.availabilityZones_public_ip } ``` #### 必需的输入变量 使用此模块时,必须在 module 块中设置这些变量。 | 名称 | 描述 | 类型 | |------|-------------|------| | prefix | 此值将插入到每个 Azure 对象的开头。注意:需要不带特殊字符的字母数字 | `string` | | resource\_group\_name | 将在其中创建资源的资源组名称 | `string` | | mgmt\_subnet\_ids | 以 Subnet-id 和 public_ip 为管理子网键的 Map | `List of Maps` | | mgmt\_securitygroup\_ids | 用于管理接口的 securitygroup\_ids | `List` | | availabilityZones | availabilityZones | `List` | | availabilityZones_public_ip | availabilityZones_public_ip | `string` | #### 可选输入变量 这些变量具有默认值,使用此模块时无需设置。您可以设置这些变量来覆盖其默认值。 | 名称 | 描述 | 类型 | 默认值 | |------|-------------|------|---------| | f5\_username | 将要部署的 F5 BIG-IP 的管理员用户名 | `string` | bigipuser | | f5\_password | 将要部署的 F5 BIG-IP 的密码。如果未指定,将生成随机密码 | `string` | "" | | f5\_instance\_type | 指定虚拟机的大小 | `string` | Standard\_DS3\_v2| | vm\_name | 要使用的 F5 BIGIP VM 名称,它应是唯一值,默认为 `empty string`,表示模块会加上 `prefix + random_id` | `string` | "" | | f5\_image\_name | 您要部署的 5 SKU(镜像)。注意:虚拟机的磁盘大小将根据您选择的选项决定。重要提示:如果打算配置多个模块,请确保选择合适的值,例如 AllTwoBootLocations 或 AllOneBootLocation | `string` | f5-bigip-virtual-edition-200m-best-hourly | | f5\_version | 默认设置为使用最新软件 | `string` | latest | | os\_disk\_size | 要创建的数据磁盘大小,大小单位为 `GB` | `number` | `84` | | f5\_product\_name | Azure BIG-IP VE Offer | `string` | f5-big-ip-best | | image\_publisher | 指定产品镜像发布者 | `string` | `f5-networks` | | storage\_account\_type | 定义要创建的存储账户类型。有效选项包括 Standard\_LRS、Standard\_ZRS、Standard\_GRS、Standard\_RAGRS、Premium\_LRS | `string` | Standard\_LRS | | enable\_accelerated\_networking | 在网络接口上启用加速网络 | `bool` | FALSE | | enable\_ssh\_key | 在 Linux 虚拟机中启用 ssh 密钥认证 | `bool` | TRUE | | f5\_ssh\_publickey | 用于通过 ssh 访问 VM 的公钥,密钥管理在模块带外进行,用户可以从 [azurerm_ssh_public_key](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/ssh_public_key) 引用此密钥 | `string` | 应在 `enable_ssh_key` 设为 `true` 时使用 | | DO_URL | 用于下载 BIG-IP Declarative Onboarding 模块的 URL | `string` | `latest` 注意:不要更改 ATC 工具 rpm 文件的名称| | AS3_URL | 用于下载 BIG-IP Application Service Extension 3 (AS3) 模块的 URL | `string` | `latest` 注意:不要更改 ATC 工具 rpm 文件的名称 | | TS_URL | 用于下载 BIG-IP Telemetry Streaming 模块的 URL | `string` | `latest` 注意:不要更改 ATC 工具 rpm 文件的名称 | | FAST_URL | 用于下载 BIG-IP FAST 模块的 URL | `string` | `latest` 注意:不要更改 ATC 工具 rpm 文件的名称 | | CFE_URL | 用于下载 BIG-IP Cloud Failover Extension 模块的 URL | `string` | `latest` 注意:不要更改 ATC 工具 rpm 文件的名称 | | INIT_URL | 用于下载 BIG-IP runtime init 模块的 URL | `string` | `latest` 注意:不要更改 ATC 工具 rpm 文件的名称 | | libs\_dir | BIG-IP 上用于下载 A&O Toolchain 的目录 | `string` | /config/cloud/azure/node_modules | | onboard\_log | BIG-IP 上用于存储 cloud-init 日志的目录 | `string` | /var/log/startup-script.log | | azure\_secret\_rg | Azure Key Vault 所在的资源组名称 | `string` | "" | | az\_keyvault\_authentication | 是否使用 key vault 进行身份验证 | `string` | false | | azure\_keyvault\_name | 要使用的 Azure Key Vault 的名称 | `string` | "" | | azure\_keyvault\_secret\_name | 包含密码的 Azure Key Vault 密钥的名称 | `string` | "" | | external\_subnet\_ids | 虚拟机所在的虚拟网络 subnetids 的 Map 列表 | `List of Maps` | [{ "subnet_id" = null, "public_ip" = null,"private_ip_primary" = "", "private_ip_secondary" = "" }] | | internal\_subnet\_ids | 虚拟机所在的虚拟网络 subnetids 的 Map 列表 | `List of Maps` | [{ "subnet_id" = null, "public_ip" = null,"private_ip_primary" = "" }] | | external\_securitygroup\_ids | 外部网络的 network Security Groupids 列表 | `List` | [] | | internal\_securitygroup\_ids | 内部网络的 network Security Groupids 列表 | `List` | [] | | custom\_user\_data | 提供 BIG-IP 在创建时运行的自定义 bash 脚本或 cloud-init 脚本 | `string` | null | | user\_identity | 分配给 BIG-IP 实例的托管用户身份 ID | `string` | null | | mgmt\_enable\_ip\_forwarding | 在 Mgmt 接口上启用 IP 转发。允许后端的内联路由 | `string` | `false` | | external\_enable\_ip\_forwarding | 在外部接口上启用 IP 转发。要允许端的内联路由,必须将其设置为 true | `string` | `true` | | tags | 应用于模块构建的资源的 `key:value` 标签 | `map` | {} | | externalnic_failover_tags | 应用于模块构建的外部 nic 资源的 `key:value` 标签 | `map` | {} | | internalnic_failover_tags | 应用于模块构建的外部 nic 资源的 `key:value` 标签 | `map` | {} | | mgmt\_app\_securitygroup\_ids | Mgmt 网络的 application Security Groupids 列表 | `List` | [] | | external\_app\_securitygroup\_ids | 外部网络的 application Security Groupids 列表 | `List` | [] | | internal\_app\_securitygroup\_ids | 内部网络的 application Security Groupids 列表 | `List` | [] | | sleep_time | 构建 BIG-IP VM 时加入的延迟秒数/分钟数 | `string` | 300s | #### 输出变量 | 名称 | 描述 | |------|-------------| | mgmtPublicIP | 为资源分配的实际 IP 地址 | | mgmtPublicDNS | 用于连接到第一个置备虚拟机的 fqdn | | mgmtPort | Mgmt 端口 | | f5\_username | BIG-IP 用户名 | | bigip\_password | BIG-IP 密码(如果选择了 dynamic_password,它将是随机生成的密码;如果选择了 azure_keyvault,它将是 key vault 密钥名称) | | public_addresses | 这是为 External-public-primary/ External-public-secondary 分配的所有公共地址的 Map 列表| | private_addresses | 这是为 Mgmt/External-Public/External-private/Internal 分配的所有私有地址的 Map 列表| | bigip\_instance\_ids | 已创建的 BIG-IP AWS Instance ID 列表 | | bigip\_nic\_ids | BIG-IP 网络接口 ID 列表 | ~ **注意:** 如果您想访问外部接口私有 IP,您需要像下面这样从 `private_addresses` map 中过滤它: ``` output "external_public_primary_private_ip" { description = "List of BIG-IP private addresses" value = flatten([for i in range(length(module.bigip.*.private_addresses)) : module.bigip.*.private_addresses[i]["public_private"]["private_ip"]]) } ``` ~>**注意:** 将会生成一个本地的 JSON 文件,其中包含 DO 声明(用于示例中提供的 1、2、3 个网卡) #### 用于测试 Automation Tool Chain 组件就绪状态的 BIG-IP Automation Toolchain InSpec Profile 在模块部署之后,我们可以使用 inspec 工具来验证 Bigip 的连通性以及 ATC 组件 此 InSpec profile 评估以下内容: + 到 BIG-IP 管理 endpoint 的基本连通性 + Declarative Onboarding (DO) 服务的可用性 + Declarative Onboarding (DO) 服务报告的版本 + Application Services (AS3) 服务的可用性 + Application Services (AS3) 服务报告的版本 + Telemetry Streaming (TS) 服务的可用性 + Telemetry Streaming (TS) 服务报告的版本 + Cloud Failover Extension( CFE ) 服务的可用性 + Cloud Failover Extension( CFE ) 服务报告的版本 #### 运行 inspec 测试 我们可以运行 inspec exec 命令,或者在任何示例 nic 文件夹中执行 runtests.sh,这将运行以下 inspec 命令 ``` inspec exec inspec/bigip-ready --input bigip_address=$BIGIP_MGMT_IP bigip_port=$BIGIP_MGMT_PORT user=$BIGIP_USER password=$BIGIP_PASSWORD do_version=$DO_VERSION as3_version=$AS3_VERSION ts_version=$TS_VERSION fast_version=$FAST_VERSION cfe_version=$CFE_VERSION ``` ## 支持信息 此仓库由社区提供支持。请按照以下说明提交问题。 ### 提交问题与获取帮助 如果您遇到 bug 或其他问题,请使用 [GitHub Issues](https://github.com/F5Networks/terraform-azure-bigip-module/issues) 向我们的团队提交问题。您还可以在该页面上查看当前已知的问题,这些问题带有紫色的 Known Issue 标签。 ## 版权 版权所有 2014-2019 F5 Networks Inc. ### F5 Networks 贡献者许可协议 在您开始向 F5 Networks, Inc. (F5) 在 GitHub 上赞助的任何项目贡献之前,您需要签署一份贡献者许可协议(CLA)。 如果您以个人身份签署,我们建议您在签署 CLA 之前与您的雇主(如果适用)沟通,因为某些雇佣协议可能对您向其他项目做出贡献有限制。否则,提交 CLA 即表示您在法律上有权授予其中所引用的许可。 如果您的雇主对您创建的知识产权(例如您的贡献)享有权利,则表示您已获得代表雇主做出贡献的许可,您的雇主已放弃了对您贡献的此类权利,或者您的雇主已与 F5 签署了单独的 CLA。 如果您代表公司签署,则表示您在法律上有权授予其中所引用的许可。您还须作进一步声明,提交贡献实体的每位员工均获得授权,可根据 CLA 代表该实体提交此类贡献。
标签:ECS, F5 BIG-IP, Microsoft Azure, Terraform, 特权提升, 自动化部署, 运维