区块链网站|NFTS Terra(LUNC) Terraform如何导入和管理现有的AWS安全组?

Terraform如何导入和管理现有的AWS安全组?

广告位

Terraform 如何导入以及管理 AWS 现有安全组

HashiCorp Terraform是一个IT基础设施自动化安排工具,可以使用代码来管理和维护IT资源。Terraform的命令行界面(CLI)提供了一种简单的机制,用于将配置文件部署到AWS或任何其他受支持的云,并对它们进行版本控制。它在描述云资源拓扑的配置文件中写入基础架构,例如虚拟机、存储帐户和网络接口。

Terraform是一个高度可扩展的工具,通过提供商支持新的基础设施。Terraform让你在云上用简单的模板语言轻松定义、预览和部署云基础设施。您可以使用Terraform创建、修改和删除ECS、VPC、RDS、SLB和其他资源。

在本文中,我们将学习如何使用Terraform来管理现有的和创建的AWS安全组。基础设施革命的新时代已经开始,我们已经开始借助配置管理工具(如Ansible、Terraform、SaltStack等)以代码的形式配置、管理和经营我们的基础设施。).

如果你是Terraform新手,想知道如何把Terraform和AWS基础结合起来,可以参考这篇文章。

这篇文章的目的

我们知道Terraform非常强大,我们可以使用Terraform高效地管理或创建整个AWS/GCP/数字海洋云基础设施,但我们经常会发现我们有一些额外的资源,这些资源通常是在早期手动创建的,而不是由Terraform管理的。

将所有这些未被管理的资源(安全组)引入Terraform,并使它们成为基础设施或代码。我们可以使用Terraform导入命令。

但是一个一个的导入这些资源是很麻烦的。所以我们尝试用Ansible来自动化,结果就是这样。

使用Terraform导入

和管理现有的AWS安全组。

尽管如此,许多DevOps工程师仍然登录AWS管理控制台,手动更新安全组的入站和出站流量路由,例如打开端口和启用流量路由。这没有错,但问题是你无法跟踪你的团队所做的变更,除非你用版本控制来统一管理。这就是Infra作为代码的优势。

想象一下,你使用安全组作为代码,你做的每一个更改都在你的Git存储库中(比如BitBucket或者Github)被正确地提交和管理。将使用git日志和提交消息来跟踪每个更改,并且将有一个配置备份,以防您想要回滚。不仅如此。

我列出了为什么您应该将AWS安全组作为代码来管理的几个原因。

它使您能够跟踪所有更改,例如打开/关闭端口以及更改的原因。您可以使用提交消息进行更好的安全审计。简单高效的管理使您能够进一步自动化您的基础架构,轻松找到您的开放路线,并在任何安全事件发生之前就将其阻止。更好的业务连续性/灾难恢复战略。单击Jenkins job以允许/禁止IP/端口/组因此,将您的AWS安全组作为代码来管理是非常高效的。

现在让我们看看我是如何将现有的AWS安全组(所有安全组)导入Terraform并管理它们的。

易变地形

提供帮助

'

我是Ansible和Terraform的粉丝,这两个工具都非常擅长管理基础设施。Ansible是pythonic,Terraform有自己的语言,叫Hashicorp配置语言,也支持JSON。

我们之所以在这里使用Python,是因为我们会使用Ansible的ec2_group_facts模块来获取所有的安全组及其信息,这也可以通过AWS CLI来完成,但我更喜欢这种方式来更好地处理数据。

这是我们的设计将如何进行的示意图。

如果你看不懂我的图,我在这里写下同样的内容供你参考。

在我们的系统中。Ansible playbook是使用模块调用Terraform和ec2数据收集的主要组件ec2_group_facts。

为了让Ansible访问AWS,您需要在环境变量中启用AWS编程访问和身份验证密钥。

$ export AWS _ access _ key _ id=AK * * * * * * * * * ievxq $ export AWS _ secret _ access _ key=gbaibk * * * * * * * * * * * * * iwn 0 dgfs这足以让Ansible。但是,你可能会遇到一些隐藏的细节和问题(像我一样)。如果你遇到困难或者在评论里告诉我,你可以参考下面的文章,我会尽快帮你。

为Ansible AWS设置boto python:(https://www.middlewareinventory.com/blog/ansible-AWS-EC2/#环境_ setup _ for _ ansi ble _ to _ work _ with _ AWS _ EC2 _ module)。为AWS编程访问设置——个密钥和秘密:(https://www . middleware inventory . com/blog/terra form-AWS-example-ec2/# setup _ programmatic _ access)。安装和配置AWS CLI:(https://www.middlewareinventory.com/blog/AWS-CLI-EC2/# install _ AWS _ CLI)Terraform AWS配置基础:(https://www.middlewareinventory.com/blog/terra form-AWS-example-ec2/)在为Ansible和terra form准备好您的环境之后,我们可以继续了。

'

Ansible和Terraform

如何一起工作

完成AWS和ansible集成的访问设置后,您将能够从Ansible访问您的AWS帐户并执行所有AWS相关模块。

在本行动手册中,我们还将使用这样一个名为ec2_group_facts的模块,它可以帮助我们获得有关安全组的所有信息。这将是我们的第一步。

然后,我们将为从AWS帐户获得的每个安全组创建一个目录,并使用Terraform import命令和安全组ID来创建一个Terraform配置文件。

导入后,我们需要删除terraform配置文件中的一些配置元素,如ownerid、arn、group id等。这些值/元素应该由terraform自动填充,所以Terraform不会让你提前定义。

从配置文件中删除这些自动生成的元素/变量后,我们将使用下面的terraform validate命令来验证文件。

因此,这是我们需要采取的四个步骤,使您的所有安全组都由Terraform管理。

翻译剧本

导入所有安全组

并添加到Terraform中。

所以,是时候写点代码了,理论就够了。

在执行脚本之前,需要记住一些事情:

您需要更新destdir变量,ansible将为它正在获取的每个安全组创建一个新目录。目录名将与安全组名相同(如果安全组名中有空格,它将被转换为连字符)。您需要在相应vpc的剧本中替换vpc-ID变量。

–name:Security Group Playbook hosts:localhost vars:destdir:/apps/gritfy/terra form/sec groups items to change:[' arn \\ s=。#39;' \\sid\\s=。#39;' owner_id\\s=。#39;] tasks: – name: ec2安全组信息提取ec2 _ Group _ facts:filters:VPC-id:VPC-0 A8 AE 2c 90 F5 ca 6 CFA register:result-name:创建安全组id和名称的字典set _ fact:sec dict:' { { sec dict | default([])[{ ' name 'item . Group _ name . replace(''-'),' id 'item . Group _ id }]} } ' with _ items:{ { result . Security _ groups } } ' loop _ control被管理文件的路径。状态:目录寄存器:dircrt循环:“{ { sec dict } }”-名称:Terraform导入外壳:| git init echo ' provider ' AWS ' { \\ n \\ t region=' us-east-1 ' \\ n } \\ n \\ n resource ' AWS _ security _ group ' ' elb _ SG ' { \\ n } ' main . TF terra form init terra form Import AWS _ security _ group . elb _ SG { { item . id } } echo ' provider ' AWS ' { \\ n \\ t region=' us-eastgit状态git commit -m '已更新Git ' pwd ls-lrt args:chdir:“{ { destdir } }/{ { item . name } } { { item . id[0:7]} } '循环:“{{secdict}}”何时:dircrt已更改-name:Change config line infile:path:“{ { destdir } }/{ { item . 0 . name } } { { item . 0 . id[0:7]} }/main . TF ' regexp:“{ { item . 1 } } ' state

可行的剧本任务描述

让我们浏览一下脚本,了解一下每个任务的设计目的。

01任务:EC2信息采集

该任务使用一个名为ec2_group_facts的模块,该模块使用您环境中的AWS访问密钥和机密直接连接到您的AWS帐户,并获取属于vpc参数中提到的特定安全组的所有安全组。确保vpc-id在运行脚本之前更新过滤器值。

任务:使用收集的值创建一个字典。

ec2_group_facts模块将生成许多关于安全组的信息,但是我们只需要一个安全组名称和一个安全组id。

因此,我们正在遍历上一个任务收集的输出,并创建一个名为secdict的字典。我们使用set_fact模块在运行时创建变量。

03任务:为每个安全组创建一个目录——命名约定。

如前所述,我们将为每个安全组创建一个专用目录,其中将保存相应安全组的Terraform配置文件。

该目录的名称将由安全组名称的前7个字符和安全组ID组成,以避免重复。AWS对安全组的命名没有唯一的名称约束,因此可以有多个同名的安全组。

04任务:地形导入任务

在这个任务中,我们一个接一个地运行多个命令,就像我们在shell提示符下键入一样。使用ansible shell模块

这些是我们将完成的任务列表:

我们在新创建的sec组目录中初始化git repo,创建以AWS供应商规范命名的main.tf Terraform配置文件,执行terraform init以初始化目录中的terraformterraform导入,使用命令和相应安全组的id执行导入过程,并将导入的配置写回main.tf。我们在步骤2中创建的配置文件中的其余步骤用于版本控制更改,如添加和提交。

任务05: Terraform文件更正并删除不必要的单词。

在此任务中,我们将从创建的main.tf配置文件中删除不必要的行,否则该文件将在语法上不正确。

06任务:检验更改后的配置

最后,我们可以使用将在所有安全组目录中执行的命令来验证Terraform配置文件main.tf对于每个安全组是否有效。当验证命令使用ansi ble failed _ whenterform validate返回失败消息时,它是一个失败(https://www.middlewareinventory.com/blog/ansible-changed _ when-and-failed _ when-examples/)。

剧本执行和结果

如果你做的一切都是对的。您可以将属于特定VPC的所有安全组导入您的AWS帐户,并使用Terraform管理它们。

您将在行动手册中定义的工作区(destdir)目录下创建一个具有安全组名称的目录。

在Terraform文件中。

进行更改并应用于验证。

导入配置文件并做好准备后,转到创建的任何安全组目录,编辑main.tf文件并进行更改,例如添加新的条目规则或更改允许端口号的CIDR IP地址。

更改完成后。我们可以使用terraform计划和terraform应用它。

我们将能够看到我们的安全组已经被Terraform成功管理。

广告位
本文来自网络,不代表区块链网站|NFTS立场,转载请注明出处:https://www.qklwz.com/jzb/lunc/57679.html
上一篇
下一篇

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

返回顶部