基础设施即代码是云锁定

2021-08-06 18:20:36

我非常喜欢在我所有的 DevOps 工作中使用 IaaC 工具。能够在代码中定义您的基础设施,并且确切地知道您在云中拥有什么,我感到非常高兴。它可以帮助您避免必须向公司员工询问某物的位置的情况。您可以简单地按 CTRL+F 浏览项目(假设您将其存储在单个存储库中),并且您始终知道某些东西在哪里。该领域的两个(三个?)最大的工具是 Terraform(最好使用 Terragrunt)和 Pulumi。在您的云提供商中设置环境时,这些工具允许(几乎)完全幂等性。一旦部署完成,您就可以确定云中的内容实际上就在那里。然后,您可以根据该假设为您的服务和工作创建不同的环境。但是,这些东西最好与有据可查且开发完善的云提供商(例如 AWS、Azure、GCP、DigitalOcean 等)一起使用。例如,您可以使用 AWS Cognito 设置对服务的 SSO 保护访问,并通过 App Load Balancer 传递该流量,以使您的服务在没有适当访问权限的情况下无法访问。所有这些都可以用存储在 Git 存储库中的代码编写,并使其可重现,甚至将其模块化以用于不同的服务。但是,当您考虑要使用 Caddy 等现成解决方案设置相同的内容时,事情开始变得粗略。 Caddy 有一个很棒的插件,称为 caddy-auth-portal,它或多或少可以提供与上一段中提到的设置相同的功能。您如何将它与您喜欢的……内部部署基础设施一起使用?或者只是像 EC2 这样的云实例?如果您使用过基础设施,那么您的第一个选择就是使用 Ansible 等基础设施自动化工具。

但是,您将找不到任何可以管理 Caddy 或根本无法管理任何东西的东西。在这种情况下,Ansible 将只是一个花哨的 SSH 命令运行器,其中包含一些让您的生活更轻松的模块,所有这些模块都包含在广受欢迎的 YAML 和 Jinja2 模板中。我们想设置对不支持开箱即用的应用程序的 SSO 访问。为了论证起见,让我们假设它的 Prometheus 仪表板具有默认设置。不详细介绍 - 您使用 SAML 身份提供商为 AWS Cognito 用户池设置资源。然后,您使用 terraform 文档资源“aws_lb”“front_end”{ # ...}resource“aws_lb_target_group”“front_end”{ # ...}resource 中的现成示例设置针对您的服务(无论是在内部网络中)的负载均衡器"aws_cognito_user_pool" "pool" { # ...}resource "aws_cognito_user_pool_client" "client" { # ...}resource "aws_cognito_user_pool_domain" "domain" { # ...}resource "aws_lb_listener" "front_end" { load_balancer_arn = aws_lb. front_end.arn port = "80" protocol = "HTTP" default_action { type = "authenticate-cognito"authenticate_cognito { user_pool_arn = aws_cognito_user_pool.pool.arn user_pool_client_id = aws_cognito_user_pool_client.client.id user_pool_domain }. = "forward" target_group_arn = aws_lb_target_group.front_end.arn }} 假设您在这里和那里调整了一些东西 - viola,您的服务现在已启用 SSO。好吧,您首先需要知道您将要设置的实例。您需要运行它并预先定义它,因为 ansible 只是在 SSH 中运行命令的自动化。

您的计算机还需要对该服务器进行适当的 SSH 访问(这可能会有所不同,具体取决于您是否位于防火墙后面)。之后,您需要知道将针对哪个操作系统。这些操作系统的不同提供商之间也可​​能存在差异!现在让我们假设您使用的是 Ubuntu 20.04。使用新的 Ubuntu 服务器和已经设置的 ubuntu 服务器之间会有区别,如果您在没有 sudo 访问的情况下使用它,也会有所不同。如果您正确设置了 Ansible,您现在可以使用一些现成的社区角色,例如 https://github.com/caddy-ansible/caddy-ansible 但是设置这些参数将需要您写下基于 jinja 的模板进行配置,如果角色变量不足以设置它。您还需要考虑如何获得对服务器的公共 IP 访问权 - 如果您的服务器在防火墙后面,您可能需要设置某种防火墙规则? IDK 但是我们继续,现在这些角色只安装ansible本身,我们需要在它的变量中指定caddy_package来安装greenpau/caddy-auth-portal

我不想让它太长 - 但你可以清楚地看到我的意思。这片土地没有证件,没有标准化,而且很简单。这就是我认为 terraform 如此强大的原因。那里的提供商及其文档提供了极大的帮助,而且您在一个地方拥有所有内容的事实也是一个很大的优势。 Ansible 只是花哨的 ssh 命令运行程序,还记得吗?它无法说明系统的当前状态或逆转其更改。最好的办法是重新安装操作系统。 Terraform 在工作时很棒,当您想在您选择的云提供商中创建可维护的基础设施时,基础设施即代码是一种祝福。如果您偏离正轨并尝试使用云服务未提供的东西,请不要抱太大希望。然后你就陷入了绝望的境地。