Terraform 如何导入以及管理 AWS 现有安全组
新钛云服已累计为您分享727篇技术干货
本文的目的
Terraform import
命令。使用 Terraform 导入
和管理现有 AWS 安全组
它使您能够跟踪所有更改,例如打开/关闭端口以及更改的原因。 您可以使用 Commit 消息进行更好的安全审计 轻松高效的管理 使您能够进一步自动化您的基础架构 轻松找到您的公开路线并在发生任何安全事件之前进行预防 更好的业务连续性/灾难恢复策略。 单击 Jenkins 作业允许/禁止 IP/端口/组
Ansible + Terraform
– 提供帮助
ec2_group_facts
模块获取所有安全组及其信息,这也可以使用 AWS CLI 完成,但我更喜欢这种方式来更好地处理数据。ec2_group_facts
。$ export AWS_ACCESS_KEY_ID=AK************IEVXQ
$ export AWS_SECRET_ACCESS_KEY=gbaIbK*********************iwN0dGfS
为 Ansible AWS 设置 Boto python:(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) 安装和配置 AWS CLI:(https://www.middlewareinventory.com/blog/aws-cli-ec2/#Install_AWS_CLI) Terraform AWS 配置基础知识:(https://www.middlewareinventory.com/blog/terraform-aws-example-ec2/)
Ansible 和 Terraform
如何协同工作
ec2_group_facts
,它可以帮助我们获取有关安全组的所有信息。那将是我们的第一步。terraform import
命令和安全组 ID创建 Terraform 配置文件。terraform validate
命令验证文件。Ansible Playbook
导入所有安全组
并添加到 Terraform
您需要更新 destdir
变量,ansible 将为它正在获取的每个安全组创建新目录。目录名称将与安全组名称相同(如果安全组名称中有空格,它将被转换为-
连字符)你需要替换你对应vpc的vpc-id变量
---
name: Security Group Playbook
hosts: localhost
vars:
destdir: /apps/gritfy/Terraform/SecGroups
itemstochange: ['arn\s+=.+$','\sid\s+=.+$','owner_id\s+=.+$']
tasks:
name: ec2 security group information fetch
ec2_group_facts:
filters:
vpc-0a8ae2c90f5ca6cfa :
register: result
name: Creating a dictionary of Security Group IDs and Names
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: Create the Directory
file:
path: "{{destdir}}/{{item.name}}{{item.id[0:7]}}" # required. Path to the file being managed.
state: directory
register: dircrt
loop: "{{secdict}}"
name: Terraform Import
shell: |
git init
echo 'provider "aws" {\n\tregion = "us-east-1"\n} \n\nresource "aws_security_group" "elb_sg" {\n\n}' > main.tf
terraform init
terraform import aws_security_group.elb_sg {{item.id}}
echo 'provider "aws" {\n\tregion = "us-east-1"\n} \n' > main.tf
terraform show -no-color >> main.tf
git add .
git status
git commit -m "Updated Git"
pwd && ls -lrt
args:
chdir: "{{destdir}}/{{item.name}}{{item.id[0:7]}}"
loop: "{{secdict}}"
when: dircrt is changed
name: Change config
lineinfile:
path: "{{destdir}}/{{item.0.name}}{{item.0.id[0:7]}}/main.tf"
regexp: "{{ item.1 }}"
state: absent
backup: yes
with_nested:
"{{ secdict }}"
"{{ itemstochange }}"
name: Terraform Validate
shell: |
terraform validate
args:
chdir: "{{destdir}}/{{item.name}}{{item.id[0:7]}}"
loop: "{{secdict}}"
register: tfvalidate
failed_when: "'Success' not in tfvalidate.stdout"
Ansible Playbook 任务说明
ec2_group_facts
,它使用您环境中的 AWS 访问密钥和秘密直接连接到您的 AWS 帐户并获取所有属于vpc
参数中提到的特定的安全组。确保vpc-id
在运行剧本之前更新过滤器值。security group name
和security group id
secdict
我们正在使用set_fact
模块在运行时创建变量的字典我们在新建的sec组目录下初始化一个git repo 创建一个 main.tf
以 AWS 供应商规范命名的 Terraform 配置文件执行 terraform init
以在目录上初始化 terraformterraform import
使用命令和相应安全组的 id执行导入过程将导入的配置写回到 main.tf
我们在第 2 步创建的配置文件中其余步骤用于版本控制更改,如添加、提交等。
main.tf
配置文件中删除不需要的行,否则会使文件在语法上不正确。main.tf
是否对每个安全组有效。当验证命令使用ansible failed_whenterraform validate
返回失败消息时,则为失败(https://www.middlewareinventory.com/blog/ansible-changed_when-and-failed_when-examples/)playbook 执行和结果
在 Terraform 文件中
进行更改并应用它来验证
main.tf
文件并进行更改,例如添加新的入口规则或更改允许的端口号的 CIDR IP 地址等terraform plan
然后terraform apply
它推荐阅读
推荐视频
微信扫码关注该文公众号作者
戳这里提交新闻线索和高质量文章给我们。
来源: qq
点击查看作者最近其他文章