如何迁移 Ansible Playbook 以支持 AWS boto3
如何迁移 Ansible Playbook 以支持 AWS boto3
Red Hat Ansible Automation Platform 以自动化 Linux、Windows 和网络基础设施而闻名。虽然 Ansible 的社区版本和我们的企业产品 Red Hat Ansible Automation Platform 都以配置管理而闻名,但这只是您可以使用 Ansible 自动化真正实现的一小部分。Ansible Automation Platform 非常擅长自动化许多其他用例,例如您的 AWS、Azure 或 Google 公有云
Ansible Automation Platform 可以自动化您的公有云的部署、迁移和运维任务。这非常强大,因为您可以编排整个基础设施工作流,从云部署到实例配置,再到停用,而无需为每个单独的用例使用一个点工具。这还使 IT 管理员能够专注于自动化业务成果,而不是单个技术孤岛。
具体到这篇博文中,我想介绍一下如何将您的 Ansible Playbook 从不支持的 ec2 模块转换为完全支持的 ec2_instance 模块,以在 AWS 上配置实例。亚马逊已弃用其软件开发工具包 (SDK) Boto,转而使用更新的完全支持的 SDK Boto3。Alina Buzachis 在 2021 年 10 月宣布了“新增功能:Ansible AWS 集合 2.0 版本”,其中包括对我们的 Red Hat Ansible 认证内容集合中 amazon.aws.ec2_instance 模块的完全支持,该模块使用 Python 3 和 Boto3。
支持的 ec2_instance 模块已经存在一段时间了,但我还没有将其用于我的用例,因为我们需要最后一个功能才能与旧的 ec2 模块保持一致。具体来说,对于演示和研讨会,我需要 exact_count 参数。这允许我启动与我指定的数量相同的实例。例如,如果我指定 exact_count: 50,它将启动 50 个相同的 Red Hat Enterprise Linux 8 实例。
使用 exact_count 可以节省数小时的时间,而无需使用循环,而且我不需要一个庞大的声明式文件来表示我的 50 台服务器;只需调整一个参数即可创建相同的副本。 幸运的是,我们知道我们有这个参数,所以我开始将技术营销团队使用的所有研讨会和演示转换为 Boto3。
让我们看看我们技术研讨会中任务文件的一个旧版本,以便我向您展示如何从 ec2 转换为ec2_instance
--- - name: Create EC2 instances for RHEL8 ec2: assign_public_ip: true key_name: "{{ ec2_name_prefix }}-key" group: "{{ ec2_security_group }}" instance_type: "{{ ec2_info[rhel8].size }}" image: "{{ node_ami_rhel.image_id }}" region: "{{ ec2_region }}" exact_count: "{{ student_total }}" count_tag: Workshop_node1": "{{ ec2_name_prefix }}-node1" instance_tags: Workshop_node1": "{{ ec2_name_prefix }}-node1" Workshop: "{{ ec2_name_prefix }}" Workshop_type: "{{ workshop_type }}" wait: "{{ ec2_wait }}" vpc_subnet_id: "{{ ec2_vpc_subnet_id }}" volumes: - device_name: /dev/sda1 volume_type: gp2 volume_size: "{{ ec2_info[control_type].disk_space }}" delete_on_termination: true register: control_output
要将实例启动到 AWS,只需要六个必需的参数。您需要指定一个密钥(即访问镜像的 SSH 密钥)、安全组(您的 ec2 实例的虚拟防火墙)、instance_type(例如 t2.medium)、区域(例如 us-east-1)、镜像(例如 RHEL8 的 AMI)和网络接口或 VPC 子网 ID (vpc_subnet_id)。
上面我的任务中的其余参数用于
- 调整实例
- 添加公共 IP 地址,增加存储空间
- 更改模块行为
- wait 指的是等待实例达到运行状态,
- exact_count 指的是并行配置多个实例
- 标签,这只是向实例添加键值标签,以便我们可以在后续自动化中对其进行过滤,或者在 AWS Web 控制台中轻松排序。
要将其转换为 ec2_instance,您只需进行一些小的调整!
ec2 | ec2_instance |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
修改后的整个任务如下所示
- name: Create EC2 instances for node1 ec2_instance: key_name: "{{ ec2_name_prefix }}-key" security_group: "{{ ec2_security_group }}" instance_type: "{{ ec2_info[rhel].size }}" image_id: "{{ node_ami_rhel.image_id }}" region: "{{ ec2_region }}" exact_count: "{{ student_total }}" network: assign_public_ip: true filters: "tag:Workshop_node1": "{{ ec2_name_prefix }}-node1" tags: Workshop_node1: "{{ ec2_name_prefix }}-node1" Workshop: "{{ ec2_name_prefix }}" uuid: "{{ ec2_name_prefix }}" guid: "{{ ec2_name_prefix }}" Workshop_type: "{{ workshop_type }}" wait: "{{ ec2_wait }}" vpc_subnet_id: "{{ ec2_vpc_subnet_id }}" volumes: - device_name: /dev/sda1 ebs: volume_type: gp2 volume_size: "{{ ec2_info[rhel].disk_space }}" delete_on_termination: true
虽然任务看起来可能很长,但请注意,可选标签占用了七行……这没问题,我正在显示许多默认值。请记住,向云资源添加标签不会产生额外费用,并且它们有助于后续自动化和过滤。我曾经听到一位同事感叹,标签永远不会嫌多!
查看上面的任务,您会看到任何带有标签 Workshop_node1: "-node1" 的内容都将用于验证现有实例是否匹配。它将确保存在具有标签 Workshop_node1 的 exact_count 个实例。这也可以在后续自动化中用于过滤和检索您想要的实例。
- name: grab instance ids to tag rtr1 ec2_instance_info: region: "{{ ec2_region }}" filters: "tag:Workshop_node1": "{{ ec2_name_prefix }}-node1" register: node1_output
这将检索所有具有其公共标签的实例。您可能还需要每个实例的唯一标签。在这种情况下,我建议使用 ec2_tag 模块,其中循环 效率更高(与使用 ec2_instance 模块循环相比)
- name: Ensure tags are present for node1 ec2_tag: region: "{{ ec2_region }}" resource: "{{ item.1.instance_id }}" state: present tags: Name: "{{ ec2_name_prefix }}-student{{ item.0 + 1 }}-node1" Index: "{{ item[0] }}" Student: "student{{ item.0 + 1 }}" launch_time: "{{ item.1.launch_time }}" with_indexed_items: - "{{ node1_output.instances }}" when: node1_output.instances|length > 0
当您需要特定云资源的唯一标签时,ec2_tag 模块非常有用。在上面的示例中,名称、索引、学生标识符和启动时间对于该资源是唯一的。同样,添加标签不会产生时间惩罚或成本,因此您可以根据需要添加尽可能多的标签。因此,在 AWS 上配置大量实例的工作流如下所示
- 批量配置
exact_count
个实例 - 使用
ec2_instance
或ec2_instance_info
将输出注册到变量 - 对于唯一标签,使用
ec2_tag
模块遍历实例
感谢您阅读我的博客,希望这能帮助您在 Ansible 云自动化之旅中有所收获。