HashiCorpTerraform是一个IT基础设施自动化编排工具,可以使用代码来管理和维护IT资源。Terraform的命令行界面(CLI)提供了一种简单的机制,用于将配置文件部署和版本控制到AWS或任何其他受支持的云。它在描述云资源拓扑结构的配置文件中编写基础架构,例如虚拟机、存储帐户和网络接口。Terraform是一个高度可扩展的工具,它通过提供者支持新的基础设施。Terraform使您能够使用简单的模板语言在云上轻松定义、预览和部署云基础设施。您可以使用Terraform创建、修改和删除ECS、VPC、RDS、SLB等资源。在本文中,我们将了解如何使用Terraform管理现有和创建的AWS安全组。基础设施革命的新时代已经开始,我们已经开始在Ansible、Terraform、SaltStack等配置管理工具的帮助下以代码的形式配置、管理和治理我们的基础设施。如果您是Terraform的新手并想学习如何使用TerraformwithAWS基础,可以参考这篇文章。就本文而言,我们知道Terraform非常强大,我们可以使用Terraform高效地管理或创建整个AWS/GCP/DigitalOcean云基础设施,但我们经常发现自己有一些额外的资源,这些资源通常是手动创建的早于Terraform管理。将所有这些非托管资源(安全组)引入Terraform并使它们成为基础设施即代码。我们可以使用Terraform导入命令。但是要将这些资源一一导入是很麻烦的。所以我们尝试使用Ansible将其自动化,就在这里。使用Terraform导入和管理现有AWS安全组尽管如此,许多DevOps工程师仍然登录AWS管理控制台手动更新安全组入站和出站流量路由,例如开放端口,启用流量路由等。这没有错,但问题是您无法跟踪您的团队所做的更改,除非您已将它们与版本控制统一起来。这就是Infraascode的优势。想象一下,您将安全组作为代码,并且您所做的每项更改都在您的Git存储库(如BitBucket或Github)中正确提交和管理。每个更改都将通过git日志和提交消息进行跟踪,并且还会有一个配置备份,以备您想要回滚时使用。不仅。我列出了您应该将AWS安全组作为代码进行管理的几个原因。它使您能够跟踪所有更改,例如打开/关闭端口和更改原因。您可以使用Commit消息进行更好的安全审计简单高效的管理使您能够进一步自动化您的基础架构轻松找到暴露的路由并在任何安全事件发生之前防止它们更好的业务连续性/灾难恢复策略。单击Jenkins作业允许/禁止IP/端口/组因此,将您的AWS安全组作为代码进行管理非常有效。那么现在让我们看看我是如何设法将我现有的AWS安全组(所有安全组)导入到Terraform中并进行管理的。Ansible+Terraform-帮助我是Ansible和Terraform的粉丝,两者都非常适合管理基础设施,而Ansible是pythonic,Terraform有自己的语言,称为Hashicorp配置语言,它也支持JSON。我们在这里使用Python的原因是我们将使用Ansible的ec2_group_facts模块来获取所有安全组及其信息,这也可以使用AWSCLI完成,但我更喜欢这种方式来更好地处理数据。这是我们的设计将如何进行的说明。如果看不懂我的图,我也写在这里供参考。在我们的设置中。Ansible剧本是使用模块调用Terraform和ec2_group_facts进行EC2数据收集的主要组件。为了让Ansible访问AWS,您需要在环境变量中启用AWS编程访问和身份验证密钥。$exportAWS_ACCESS_KEY_ID=AK************IEVXQ$exportAWS_SECRET_ACCESS_KEY=gbaIbK************************iwN0dGfS这对Ansible和Terraform可以访问您的AWS基础设施。但是,您可能会遇到一些隐藏的细节和问题(就像我一样)如果您遇到困难或在评论中告诉我,您可以参考以下文章,我会尽快帮助您为AnsibleBotopython设置AWS:(https://www.middlewareinventory.com/blog/ansible-aws-ec2/#Environment_Setup_for_Ansible_to_work_with_AWS_EC2_module)设置AWS的编程访问-密钥和秘密:(https://www.middlewareinventory.com/blog/terraform-aws-example-ec2/#Setup_Programmatic_Access)安装和配置AWSCLI:(https://www.middlewareinventory.com/blog/aws-cli-ec2/#Install_AWS_CLI)TerraformAWS配置基础:(https://www.middlewareinventory.com/blog/terraform-aws-example-ec2/)一旦您的环境准备好使用Ansible和Terraform,我们就可以继续了。“Ansible和Terraform如何协同工作完成AWS和Ansible集成的访问设置后,您将能够从ansible访问您的AWS帐户并执行所有AWS相关模块。在本剧本中,我们还将使用这样一个名为ec2_group_facts的模块,它将帮助我们获取有关安全组的所有信息。这将是我们的第一步。然后我们将为从AWS帐户获取的每个安全组创建一个目录,并使用带有安全组ID配置文件的terraformimport命令创建Terraform。之后导入完成后,我们需要删除terraform配置文件中的一些配置元素,如ownerid、arn、groupid等。这些值/元素应该由Terraform自动填充,所以terraform不会让你预先定义它。从配置文件中删除这些自动生成的元素/变量后,我们将使用以下terraformvalidate命令验证文件。因此,这些是我们为让Terraform管理您的所有安全组而采取的四个步骤。AnsiblePlaybook导入所有安全组并添加到Terraform所以,是时候编写一些代码了,理论就足够了。在执行playbook之前要记住一些事情:您需要更新destdir变量,ansible将为它正在获取的每个安全组创建新目录。目录名称将与安全组名称相同(如果安全组名称中有空格,则会转换为-连字符)您需要替换您对应的vpc的vpc-id变量ThePlaybook----名称:安全组Playbook主机:localhostvars:destdir:/apps/gritfy/Terraform/SecGroupsitemstochange:['arn\s+=.+$','\sid\s+=.+$','owner_id\s+=.+$']tasks:-name:ec2securitygroupinformationfetchec2_group_facts:filters:vpc-id:vpc-0a8ae2c90f5ca6cfaregister:result-name:创建安全组ID和名称的字典set_fact:secdict:"{{secdict|default([])+[{'name':item.group_name.replace('','-'),'id':item.group_id}]}}"with_items:"{{result.security_groups}}"loop_control:label:"{{item.group_name}}"-name:创建目录文件:path:"{{destdir}}/{{item.name}}{{item.id[0:7]}}"#必需的。被管理文件的路径.state:directoryregister:dircrtloop:"{{secdict}}"-name:TerraformImport外壳:|gitinitecho'provider"aws"{\n\tregion="us-east-1"\n}\n\nresource"aws_security_group""elb_sg"{\n\n}'>main.tfterraforminitterraformimportaws_security_group.elb_sg{{item.id}}echo'provider"aws"{\n\tregion="us-east-1"\n}\n'>main.tfterraformshow-no-color>>main.tfgit添加。gitstatusgitcommit-m"UpdatedGit"pwd&&ls-lrtargs:chdir:"{{destdir}}/{{item.name}}{{item.id[0:7]}}"loop:"{{secdict}}"when:dircrtischanged-name:Changeconfiglineinfile:path:"{{destdir}}/{{item.0.name}}{{item.0.id[0:7]}}/main.tf"regexp:"{{item.1}}"state:absentbackup:yeswith_nested:-"{{secdict}}"-"{{itemstochange}}"-名称:TerraformValidateshell:|地形验证参数:chdir:“{{destdir}}/{{item.name}}{{item.id[0:7]}}"loop:"{{secdict}}"register:tfvalidatefailed_when:"'Success'notintfvalidate.stdout"AnsiblePlaybook任务描述让我们通过剧本,了解每个任务的设计目的1.任务:EC2信息获取此任务使用一个名为ec2_group_facts的模块,它使用您环境中的AWS访问密钥和秘密直接连接到您的AWS账户并获取所有vpc参数特定的安全组中提到。确保vpc-id在运行playbook之前更新过滤器值。2.任务:用收集到的值创建字典ec2_group_facts模块产生了很多关于安全组的信息,但我们只需要一个安全groupname和securitygroupid所以我们迭代前一个任务收集的输出并创建一个名为secdict的字典我们正在使用set_fact模块在运行时创建一个变量字典3.任务:为每个安全组创建一个目录-命名Conventions如前所述,我们将为每个安全组创建专门的目录,其中将保存相应安全组的Terraform配置文件。该目录的名称将是安全组名称和安全的前7个字符的组合groupID,这是为了避免重复。AWS对安全组的命名没有唯一的名称约束,所以可以有多个同名的安全组。4.任务:Terraform导入任务在这个任务中,我们一个接一个地运行多个命令,就像我们在shell提示符下键入一样。使用ansibleshell模块这些是我们将要执行的任务列表:我们在新创建的sec组目录中初始化一个gitrepo创建一个以AWS供应商规范命名的main.tfTerraform配置该文件执行terraforminit以初始化terraform目录terraformimport用命令执行导入过程,对应安全组的id将导入的配置回写到我们在第2步创建的main.tf配置文件中。剩下的步骤就是版本控制的变化,比如添加、提交等5.任务:Terraform文件更正和去除不必要的词在这个任务中,我们将从创建的main.tf配置文件中去除不必要的行,否则会导致文件语法错误。6.任务:验证更改后的配置最后,我们可以使用将在所有安全组目录中执行的命令来验证Terraform配置文件main.tf对每个安全组是否有效。当验证命令使用ansiblefailed_whenterraformvalidate(https://www.middlewareinventory.com/blog/ansible-changed_when-and-failed_when-examples/)剧本执行和结果返回失败消息时失败,如果你做的一切都是正确的。您将能够在您的AWS账户中导入属于特定VPC的所有安全组,并能够使用Terraform管理它们。您将在playbook中定义的workspace(destdir)目录下创建具有安全组名称的目录。在Terraform文件中进行更改并将其应用于验证导入配置文件,它已准备就绪,转到您创建的任何安全组目录并编辑main.tf文件并进行更改,例如添加新的入口规则或更改允许的端口号CIDRIP地址等修改后。然后我们可以使用terraformplan然后terraformapply它,我们将能够看到我们的安全组已经被Terraform成功管理。
