标签 Terraform 下的文章

他还称,Linux 基金会接受 OpenTofu 的决策是一个 “悲剧”。

(本文节略自 The Stack 的文章

HashiCorp 的 CEO 在该公司本月的用户会议上为其改变许可证的做法辩护。他预测,除非社区重新思考如何保护创新,否则硅谷将 “不再有开源公司”。

作为 IaaC 的先驱者,他在 HashiConf 用户会议上介绍了一系列产品了更新和新特性,这是在该公司将其所有产品的版权协议从 Mozilla 公共许可证 Mozilla Public License (MPL)更改为 商业源代码许可证 Business Source License (BSL)后不到两个月时间所做的举措。

HashiCorp 当时表明,“除了在与 HashiCorp 商业产品竞争的产品中托管或嵌入软件外,所有生产用途都不受限制,无论是自我管理的还是托管的。”

然而,此举引起了开源社区的强烈反响。在 Linux 基金会的支持下,一个名为 OpenTofu 的 Terraform 分支很快地被发布出来。

HashiCorp 的 CEO Dave McJannet 本周表示,改变许可证的决策是必要的,因为 HashiCorp 的技术对现代云服务起到了关键的作用,随着全球最大的公司将其业务从本地技术转移到云服务,这种关键性只会越来越强。

尽管开源社区猛烈批评了 HashiCorp 改变许可证的决定,但 McJannet 说其最大的客户对此的反应却是,“太好了,因为你是我们的关键伙伴,我们需要你发展成一个大公司。”实际上,他表示,在很多反馈中客户表示,“我们希望你早点这么做”,并补充说,这个决定在公告之前就已经与主要的云供应商进行了讨论。

McJannet 说,“过去三四年间,每个达到一定规模的供应商都已经得出了同样的结论。……这只是意识到,鉴于市场现在的激励机制,开源模型必须演进。”

他声称,过去成立开源基金会的模式现在已经不合时宜了,这些基金会都被传统供应商所主导。以 Hadoop 为例,他说,“基金会就是大公司免遭创新影响的一种机制,如果 Hadoop 流行起来,IBM 这样的公司可以把它拿来,因为他们是基金会的一部分,他们可以以更低的价钱卖出去。”

将开源产品放到 GitHub 上 “的确非常好”,但是,一旦某个项目变得流行,“克隆供应商就开始竞相复制”。

他声称,“我们发出公告后不久,我就开始接到来自硅谷每一个开源创业公司的电话,他们都告诉我,‘我认为这才是正确的模型’。”

“确实是悲剧……”,他感叹道,Linux 基金会接受 OpenTofu 的行动,为我们揭示了一个严重的问题。“如果基金会只是简单地接收并给它找个归宿,那对开源的未来将带来怎样的影响呢?这对开源创新而言,无疑是一场悲剧。我可以坦诚告诉你,如果这样的事情真的发生,硅谷将再也看不到开源公司的身影。”

他更具体地指出,许可证的改变是他们为赢取企业信任而设计的策略的一部分。

“让其他供应商误解我们的产品是一个巨大的风险,对吗?这对我们的长期发展是不利的,对我们的客户而言也同样危险。”

他进一步解释说,赢得这些大型组织的信任是促使 HashiCorp 当时选择上市的一个驱动力。“我们并不全然需要钱,我们之所以这么做,是想要向公众表明,我们有充足的资金,可以成为他们长期信任的合作伙伴。”

他补充说,他们提议继续和受许可证更改影响的四个主要的公司合作,“只需要你们承担一部分研发成本。然而他们却拒绝,声称要另起炉灶,这对我们来说也没问题。”

(题图:MJ/5cdb5ba0-a7fa-4a29-b3dd-ef0d07bad575)


via: https://www.thestack.technology/hashicorp-ceo-predicts-oss-free-silicon-valley-unless-the-open-source-model-evolves/

作者:JOE FAY 译者:ChatGPT 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

埃隆·马斯克的 Twitter/X 关注者水分严重

埃隆·马斯克是 Twitter/X 上关注者最多的用户,高达 1.53 亿。有研究对他的关注者进行了分析,发现其中,

  • 42%(约 6530 万)的用户没有任何关注者;
  • 72%(1.12 亿)的用户其关注数量不足 10 人,全部 1.53 亿用户的关注者数量的中位数仅为 1 个;
  • 超过 40%(6250 万)的关注者没有发过任何推文或删除了全部推文,超过 1 亿的关注者发表的推文不足 10 条;
  • 超过 25%(3890 万)的关注者是在他收购 Twitter 后才创建的账号;
  • 而他的关注者中仅仅只有 0.3%(45 万)的用户是每月 8 美元的付费订阅用户(付费订阅用户总数据估计约为 83 万)。
消息来源:Mashable
老王点评:如果说,马斯克给自己弄了很多假粉,那这是自己演给自己玩吗?

OpenTF 宣布创建 Terraform 分支

HashiCorp 公司创建的基础设施即代码软件 Terraform 最初于 2014 年在 MPL 2.0 许可证下开源。但在 8 月 10 日,HashiCorp 突然将 Terraform 的许可证从 MPL 切换到了非开源的商业源代码许可证(BSL)。为了保持 Terraform 的开源性,Terraform 社区发布了 OpenTF 宣言,宣布创建 Terraform 的分支,并成立了 OpenTF 基金会。OpenTF 基金会表示,已经有四家公司承诺为该项目提供 14 名全职工程师,并预计未来几周将至少增加一倍。而且,它指出过去两年 HashiCorp 公司只提供了大约 5 名全职工程师去维护 Terraform。

消息来源:OpenTF
老王点评:当企业需要时它开源,当企业不满时它闭源。当开源时社区来了,当闭源时社区分叉了。这样的戏码我们已经见过很多次了,难道这是企业开源的宿命吗?

调查发现业界对 Rust 应用的担忧减少了 21%

Rust 项目连续第六年对 Rust 编程语言进行了调查,共有 9,433 人完成了调查。根据调查数据,

  • 超过 90% 的调查对象认为自己是 Rust 用户,其中 47% 的人每天都在使用 Rust;
  • 27% 的受访者可以编写可投入生产的代码;
  • 在放弃 Rust 用户中,30% 认为困难是放弃的主要原因;
  • 29.7% 的受访者表示,他们在工作场所的大部分编码工作都使用 Rust,这比上一年增加了 51.8%;
  • 使用 Rust 的最主要原因包括编写无错误软件的能力(86%)、Rust 的性能特点(84%)以及 Rust 的安全保障(69%);
  • 39% 的受访者表示学习过程具有挑战性,9% 的受访者表示在工作中采用 Rust 拖慢了他们团队的速度;不过,60% 的生产型用户认为,总体而言,采用 Rust 的成本是值得的;
  • 26% 的人担心 Rust 背后的开发者和维护者得不到适当的支持,这比去年的调查结果减少了 30% 以上。
消息来源:Rust
老王点评:Rust 是颇受追捧,但是我其实认为 Rust 的最大风险可能是项目方瞎折腾。

Terraform 是一种声明性语言,可以作为你正在建设的基础设施的蓝图。

在拥有一个 OpenStack 生产环境和家庭实验室一段时间后,我可以肯定地说,从管理员和租户的角度置备工作负载和管理它是很重要的。

Terraform 是一个开源的基础设施即代码(IaC)软件工具,用于 置备 provisioning 网络、服务器、云平台等。Terraform 是一种声明性语言,可以作为你正在建设的基础设施的蓝图。你可以用 Git 来管理它,它有一个强大的 GitOps 使用场景。

本文介绍了使用 Terraform 管理 OpenStack 集群的基础知识。我使用 Terraform 重新创建了 OpenStack 演示项目。

安装 Terraform

我使用 CentOS 作为跳板机运行 Terraform。根据官方文档,第一步是添加 Hashicorp 仓库:

$ sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo

接下来,安装 Terraform:

$ sudo dnf install terraform -y

验证安装:

$ terraform –version

如果你看到返回的版本号,那么你已经安装了 Terraform。

为 OpenStack 提供者创建一个 Terraform 脚本

在 Terraform 中,你需要一个 提供者 provider ,它是一个转换器,Terraform 调用它将你的 .tf 转换为对你正在协调的平台的 API 调用。

有三种类型的提供者:官方、合作伙伴和社区:

  • 官方提供者由 Hashicorp 维护。
  • 合作伙伴提供者由与 Hashicorp 合作的技术公司维护。
  • 社区提供者是由开源社区成员维护的。

在这个 链接 中有一个很好的 OpenStack 的社区提供者。要使用这个提供者,请创建一个 .tf 文件,并命名为 main.tf

$ vi main.tf

main.tf 中添加以下内容:

terraform {
  required_version = ">= 0.14.0"
  required_providers {
    openstack = {
      source  = "terraform-provider-openstack/openstack"
      version = "1.49.0"
    }
  }
}

provider "openstack" {
  user_name   = “OS_USERNAME”
  tenant_name = “OS_TENANT”
  password    = “OS_PASSWORD”
  auth_url    = “OS_AUTH_URL”
  region      = “OS_REGION”
}

你需要修改 OS_USERNAMEOS_TENANTOS_PASSWORDOS_AUTH_URLOS_REGION 变量才能工作。

创建一个 Terraform 管理文件

OpenStack 管理文件的重点是置备外部网络、路由、用户、镜像、租户配置文件和配额。

此示例提供风格,连接到外部网络的路由、测试镜像、租户配置文件和用户。

首先,为置备资源创建一个 AdminTF 目录:

$ mkdir AdminTF

$ cd AdminTF

main.tf 中,添加以下内容:

terraform {
  required_version = ">= 0.14.0"
  required_providers {
    openstack = {
      source  = "terraform-provider-openstack/openstack"
      version = "1.49.0"
    }
  }
}

provider "openstack" {
  user_name   = “OS_USERNAME”
  tenant_name = “admin”
  password    = “OS_PASSWORD”
  auth_url    = “OS_AUTH_URL”
  region      = “OS_REGION”
}

resource "openstack_compute_flavor_v2" "small-flavor" {
  name      = "small"
  ram       = "4096"
  vcpus     = "1"
  disk      = "0"
  flavor_id = "1"
  is_public = "true"
}

resource "openstack_compute_flavor_v2" "medium-flavor" {
  name      = "medium"
  ram       = "8192"
  vcpus     = "2"
  disk      = "0"
  flavor_id = "2"
  is_public = "true"
}

resource "openstack_compute_flavor_v2" "large-flavor" {
  name      = "large"
  ram       = "16384"
  vcpus     = "4"
  disk      = "0"
  flavor_id = "3"
  is_public = "true"
}

resource "openstack_compute_flavor_v2" "xlarge-flavor" {
  name      = "xlarge"
  ram       = "32768"
  vcpus     = "8"
  disk      = "0"
  flavor_id = "4"
  is_public = "true"
}

resource "openstack_networking_network_v2" "external-network" {
  name           = "external-network"
  admin_state_up = "true"
  external       = "true"
  segments {
    network_type     = "flat"
    physical_network = "physnet1"
  }
}

resource "openstack_networking_subnet_v2" "external-subnet" {
  name            = "external-subnet"
  network_id      = openstack_networking_network_v2.external-network.id
  cidr            = "10.0.0.0/8"
  gateway_ip      = "10.0.0.1"
  dns_nameservers = ["10.0.0.254", "10.0.0.253"]
  allocation_pool {
    start = "10.0.0.1"
    end   = "10.0.254.254"
  }
}

resource "openstack_networking_router_v2" "external-router" {
  name                = "external-router"
  admin_state_up      = true
  external_network_id = openstack_networking_network_v2.external-network.id
}

resource "openstack_images_image_v2" "cirros" {
  name             = "cirros"
  image_source_url = "https://download.cirros-cloud.net/0.6.1/cirros-0.6.1-x86_64-disk.img"
  container_format = "bare"
  disk_format      = "qcow2"

  properties = {
    key = "value"
  }
}

resource "openstack_identity_project_v3" "demo-project" {
  name = "Demo"
}

resource "openstack_identity_user_v3" "demo-user" {
  name               = "demo-user"
  default_project_id = openstack_identity_project_v3.demo-project.id
  password = "demo"
}

创建一个租户 Terraform 文件

作为一个 租户 Tenant ,你通常会创建虚拟机。你还为这些虚拟机创建网络和安全组。

这个例子使用上面由 Admin 文件创建的用户。

首先,创建一个 TenantTF 目录,用于与租户相关的置备:

$ mkdir TenantTF
$ cd TenantTF

main.tf 中,添加以下内容:

terraform {
  required_version = ">= 0.14.0"
  required_providers {
    openstack = {
      source  = "terraform-provider-openstack/openstack"
      version = "1.49.0"
    }
  }
}

provider "openstack" {
  user_name   = “demo-user”
  tenant_name = “demo”
  password    = “demo”
  auth_url    = “OS_AUTH_URL”
  region      = “OS_REGION”
}

resource "openstack_compute_keypair_v2" "demo-keypair" {
  name       = "demo-key"
  public_key = "ssh-rsa ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
}


resource "openstack_networking_network_v2" "demo-network" {
  name           = "demo-network"
  admin_state_up = "true"
}

resource "openstack_networking_subnet_v2" "demo-subnet" {
  network_id = openstack_networking_network_v2.demo-network.id
  name       = "demo-subnet"
  cidr       = "192.168.26.0/24"
}

resource "openstack_networking_router_interface_v2" "demo-router-interface" {
  router_id = “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”
  subnet_id = openstack_networking_subnet_v2.demo-subnet.id
}

resource "openstack_compute_instance_v2" "demo-instance" {
  name            = "demo"
  image_id        = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
  flavor_id       = "3"
  key_pair        = "demo-key"
  security_groups = ["default"]

  metadata = {
    this = "that"
  }

  network {
    name = "demo-network"
  }
}

初始化你的 Terraform

创建 Terraform 文件后,你需要初始化 Terraform。

对于管理员:

$ cd AdminTF

$ terraform init

$ terraform fmt

对于租户:

$ cd TenantTF

$ terraform init

$ terraform fmt

命令解释:

  • terraform init 从镜像源下载提供者用于置备此项目。
  • terraform fmt 格式化文件,以便在仓库中使用。

创建一个 Terraform 计划

接下来,为你创建一个 计划 plan ,看看将创建哪些资源。

对于管理员:

$ cd AdminTF

$ terraform validate

$ terraform plan

对于租户:

$ cd TenantTF

$ terraform validate

$ terraform plan

命令解释:

  • terraform validate 验证 .tf 语法是否正确。
  • terraform plan 在缓存中创建一个计划文件,所有管理的资源在创建和销毁时都可以被跟踪。

应用你的第一个 TF

要部署资源,使用 terraform apply 命令。该命令应用计划文件中的所有资源状态。

对于管理员:

$ cd AdminTF

$ terraform apply

对于租户:

$ cd TenantTF

$ terraform apply

接下来的步骤

之前,我写了一篇关于在树莓派上部署最小 OpenStack 集群的 文章。你可以找到更详细的 Terraform 和 Ansible 配置,并通过 GitLab 实现一些 CI/CD。


via: https://opensource.com/article/23/1/terraform-manage-openstack-cluster

作者:AJ Canlas 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

本文介绍我使用 Terraform 五年之后吸取到的经验。

 title=

使用 Terraform 五年的经历让我吸取到一些重要经验。无论团队大小、项目性质,有五条要点对于配置合乎逻辑且可用的 Terraform 平台至关重要。

1、了解你的目标受众

这一点似乎显而易见,但我也见过一些在这方面犯错的案例。当组织和规划 Terraform 的相关代码时,无论是将目录结构标准化还是确定命名规范,考虑目标受众是非常重要的。例如:你的团队是否会使用这些 Terraform 脚本和模块?你是否会向其他团队交接工作?你的团队是否会有新成员加入?你是否正在独自进行项目开发?你是否会半年或一年后仍然使用这些配置,还是会将它安排给别人?

这类问题会影响某些决策。理想情况下,无论如何都应该有 远程状态 Remote State 状态锁定 State Locking 两种状态。远程状态确保你的笔记本电脑不是你的 Terraform 唯一运行的机器,状态锁定确保同一时刻只有一个人对基础设施进行修改操作。

命名规范应该对项目的最终拥有者有意义,而不是只对开发团队有意义。如果项目会转交给其他团队,应该确保他们对命名规范有发言权。如果代码由非技术的利益相关者或内部安全/ GCR 团队负责审查,应该确保他们会检查命名规范。另外,对于资源名称,为了让代码审查人员更仔细地进行检查,你应该使用资源标签,把有关的数据分类/隐私需求(高、中、低)标示出来。

2、重用,重用,重用

Terraform 注册表 为大多数普通用例提供了现成模块类库。我已经使用过 VPC 模块和安全模块中的大量功能,这些功能只需要提供相关的参数就能使用。使用不同的参数,简单调用这些模块对于处理大部分用例已经足够了。尽可能多地重用这些公共模块,可以避免大量且重复的编码、测试、检查、修复、重构等操作。

我也发现,基于使用或变更的频率划分模块和资源大有好处。例如,只使用一次的基础设施手脚架,例如 VPC 相关设置、安全模块、路由表、VPC 端点等,可以放在一起。但是像私有托管域条目、自动伸缩模块、目标模块、负载均衡器等,每次部署时都会变化,所以把这些与一次性的基础设施手脚架分离开来,会令代码检查更方便,调试更快速。

3、要明确,而非隐含

Terraform 代码中有一些常见的模式,它会导致设计中出现错误的假设。团队可以假设用来写代码的 Terraform 版本永远保持不变,外部模块不会变化,或它们使用的提供者不会变更。当这些外部依赖不可避免地发生变化时,就会导致一些难以发现的问题。

无论何处(包括主要的 Terraform 组、提供者组、功能模块组)都要确保定义是明确的。事先定义版本,可以确保依赖库是固定的,因此你可以在讨论、审查、测试后,明明白白地更新依赖关系。

4、自动化每一处,包括笔记本电脑、共享虚拟机、CI/CD。

在部署的各个阶段使用自动化方法,可以避免可能发生的问题。

在你提交代码前,使用 Git 预提交钩子 运行 terraform fmtterraform validate。预提交钩子的作用是确保你的代码满足最低程度的格式和语法正确。把这个预提交文件检入到仓库,对你的团队成员都有好处。项目的第一步就进行质量控制相关的操作,它虽然表面上是小事一桩,但也很重要,能为项目节省大量时间。

一切现代化部署工具都有 CI 流程。当你向原始仓库推送代码时,可以使用它来运行 SAST 和单元测试工具。我写过一篇 博客,是关于使用 Checkov 测试 Terraform 代码的安全性和合规性,并为组织特定的惯例创建自定义检查。把这些单元测试工具加入到你的 CI 管道,可以改进代码质量和健壮性。

5、写个好的 README.md 文件

我们都认为 Terraform 代码是自文档化的。的确如此,但是只有当未来的团队已经了解你的公司的命名规范、开发指南、机密通信、圈内笑话,以及你的仓库内除有效的 Terraform 代码之外其他所有东西,才会如此。维护 README.md 文件是个好习惯,它能节省大量时间,而且团队成员要为自己向 README 文件提交的任何内容负责,这样也就确保团队成员的忠诚度。

你的 README 文件至少应该包含在你的工作环境下(Linux、 Windows、Mac 等等)初始化 Terraform 环境的步骤,包括 Terraform 的版本信息。它应当确定需要的依赖库(Checkov、 TerraGrunt 及其他依赖)和其版本,以及团队使用的方便的 Linux 别名(例如有人喜欢将 terraform fmt 简写为 tff)。最重要的是,需要确定分支和 PR 审核策略和流程、命名规范和资源标签的相关标准。

README 文件需要通过这样的检验:如果团队有新成员加入,能否告诉他们做什么以及如何正确地完成工作?如果不能,在后续的几个月内,你将面对的是无休止的标准和流程讨论会议。

结束语

这些就是我使用 Terraform 多年后,认为需要传授给大家的五条有用的建议。也欢迎你分享自己的最佳实践。


via: https://opensource.com/article/21/8/terraform-tips

作者:Ayush Sharma 选题:lujun9972 译者:cool-summer-021 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出