如何使用Ansible EC2 AWS模块管理虚拟机

当您管理现有的Amazon Web Service(AWS)EC2实例时,在管理控制台上点击是可以的。但随着基础架构的扩大,管理实例需要大量时间并变得复杂。有没有更好的管理实例的方法?有!AWS Ansible EC2模块可以帮助您。

在本教程中,您将了解到Ansible AWS EC2模块如何以示例驱动的方式为您提供强大的管理AWS EC2实例的能力。

继续阅读并开始吧!

先决条件

本教程包含逐步说明。如果您想跟着做,请确保您已经准备好以下内容:

  • A remote Linux computer to test out the amazon.aws.ec2_instance Ansible module. This tutorial uses Ubuntu 20.04.3 LTS as the remote node.
  • 一个AWS账户
  • 一个 AWS IAM 用户,一个访问密钥 ID 和秘钥设置在您的本地机器上,具有创建和管理 EC2 实例的访问权限。本教程将使用一个名为 ec2user 的 IAM 用户。

确保 IAM 用户已经设置为可以进行编程访问,并将其分配给 AmazonEC2FullAccess 的现有策略。

  • 配置了一个清单文件和一个或多个主机来运行 Ansible 命令和 playbooks。远程 Linux 计算机称为 myserver,本教程使用了一个名为 web 的清单组。
  • 在您的 Ansible 控制主机和远程节点机器上安装了 Python v3.6 或更高版本。本教程在 Ubuntu 机器上使用了 Python v3.8.10。
  • Python模块boto3的版本应大于1.15.0,botocore的版本应大于1.18.0,这两者需要安装在Ansible控制器主机和远程节点机器上。

使用即席命令创建或重新启动EC2实例

如果您计划在AWS账户上创建或重新启动单个EC2实例,则运行即席命令就足够了。即席命令是一种快速高效的方法,可以运行单个命令来创建EC2实例或修改AWS EC2实例的实例类型。

登录到您的Ansible控制器,并运行以下ansible命令以连接(-m amazon.aws.ec2_instance)到主机(web)。

该命令传递了一个参数(-a),告诉Ansible使用instance_tags=Name=Tag1)在us-east-2地区重新启动AWS EC2实例。为了验证与AWS账户的连接,您在即席命令中添加了aws_access_keyaws_secret_key的详细信息。

本教程在us-east-2地区执行所有操作,但您可以选择在任何AWS地区执行相同的操作。

ansible web -m amazon.aws.ec2 -a " state=restarted instance_tags=Name=Tag1 aws_access_key=AKIAVWOJMI5I2DPXXXX aws_secret_key=F9PaprqnPUn/XXXXXXXXXXXX region=us-east-2"

一旦命令完成,您将看到一个CHANGED消息,如下所示,确认Ansible成功重新启动了AWS EC2实例。

Running an Ad Hoc Command to Restart an Amazon EC2 Instance

启动一个 EC2 实例与 Ansible Playbook

您刚刚学会了如何执行 Ansible 的临时命令,这对于一次性操作非常有用!但也许您需要执行多个任务。如果是这样,请创建一个 Ansible playbook,用于启动一个 EC2 实例来运行多个任务。

1. 在您的 Ansible 控制主机上打开终端,然后运行以下命令来创建一个名为~/ansible_aws_ec2_module的目录,并切换到该目录。

该目录将包含playbook和您将用来调用 Ansible AWS EC2 模块的所有必需配置文件。

mkdir ~/ansible_aws_ec2_module
cd ~/ansible_aws_ec2_module

2. 接下来,打开您喜爱的文本编辑器,在~/ansible_aws_ec2_module目录中创建一个名为main.yml的文件。使用以下 YAML playbook 内容填充main.yml文件。

以下 playbook 包含启动具有特定 VPC 内的公共 IP 地址的实例的任务,该 VPC 位于 AWS 帐户中。

从本教程的这一点开始,将aws_access_keyaws_secret_key的值替换为您自己的值。

---
- name: Ansible EC2 instance Launch module demo
# 定义 Ansible EC2 模块将管理对象的远程服务器
  hosts: web
  remote_user: ubuntu # 使用远程用户 ubuntu
  tasks:
		# 启动具有公共 IP 的 AWS EC2 实例的任务
    - name: start an instance with a public IP address
      amazon.aws.ec2:
				# 设置密钥名称
        key_name: mykey
				# 定义实例类型、镜像、VPC 子网 ID、分配公共 IP、AWS 区域
        instance_type: t2.micro
        image: ami-0b9064170e32bde34
        wait: yes
        count: 1
        vpc_subnet_id: subnet-0dc9af4c75ad3e2ee
        assign_public_ip: yes
        aws_region: us-east-2
        aws_access_key: AKIAVWOJMI5XXXXXXXX
        aws_secret_key: F9PaprqnPUn/NP8lzQXXXXXXXXXXXXXXXXXX

3. 运行以下命令来调用 playbook(main.yml)。playbook 然后执行任务,以在 us-east-2 区域创建一个实例,实例类型为 t2.micro。

ansible-playbook main.yml

下面,您可以看到一些任务显示 changed 状态,这表示 Ansible 成功创建了实例并修改了任务的状态以运行命令。相反,您会看到 ok 状态,因为一些任务不需要更改。

Executing a Playbook

4. 现在,打开您喜欢的网络浏览器,并登录到 AWS 管理控制台

5. 最后,在控制台顶部的搜索栏中,搜索 EC2,然后单击 EC2 菜单项。这样做会将您的浏览器重定向到 EC2 页面。

Searching the EC2 service in the AWS account

在 EC2 页面上,您将看到您新创建的实例,如下所示。

newly created instance

停止多个 AWS EC2 实例

也许有一些 AWS EC2 实例已经不再起作用了。如果是这样,您可以通过执行 Ansible playbook 来停止或终止多个实例。在任务中指定实例 ID 并声明值以设置 Ansible EC2 AWS 模块在停止实例时的行为。

1. 创建一个名为 stop.yml 的 Ansible playbook,并将下面的代码复制/粘贴到 playbook 中。

下面的 playbook 停止了两个实例(i-0d8c7eb4eb2c643a1 和 i-0dbc17a67c0f7577c)。

---
- name: Stopping the already Launched EC2 instances using Ansible EC2 Module
# 定义 Ansible EC2 模块将管理对象的远程服务器
  hosts: web
  gather_facts: false
  # 使用远程用户 ubuntu
  remote_user: ubuntu 
  vars:
    instance_ids:
      - 'i-0d8c7eb4eb2c643a1'
      - 'i-0dbc17a67c0f7577c'
    region: us-east-2
  tasks:
    - name: Stopping the already launched AWS EC2 instances
      amazon.aws.ec2:
        instance_ids: '{{ instance_ids }}'
        region: '{{ region }}'
        state: stopped
        wait: True
        vpc_subnet_id: subnet-0dc9af4c75ad3e2ee
        assign_public_ip: yes
        aws_access_key: AKIAVWOJMI5XXXXXXXX
        aws_secret_key: F9PaprqnPUn/NP8lzQXXXXXXXXXXXXXXXXXX

如果您希望终止实例而不是停止它们,请将 state 的值更改为 absent

2. 现在运行下面的命令来执行 playbook(stop.yml),这将停止您在 playbook 中指定的实例。 ansible-playbook stop.yml

ansible-playbook stop.yml
Executing the Ansible playbook using the ansible-playbook command.

3. 最后,导航到您的 AWS 实例在您的网络浏览器中,您会看到两个成功停止的实例,如下所示。

Viewing Stopped Instances

使用标签、卷和 Cloud Watch 监控创建实例

也许您需要使用更先进的组件来配置您的实例,例如标记、使用 CloudWatch 告警进行监控以及为存储创建卷。在这种情况下,使用 Ansible EC2 AWS 模块在 playbook 中执行将会解决问题。

标签是组织 AWS 资源并在 AWS 管理控制台中进行高效资源成本计算的绝佳方式。

1. 创建一个名为advanced.yml的新 Ansible playbook,并使用以下代码填充 playbook。

下面的 playbook 将使用指定的配置启动 AWS EC2 实例(volumes—> /dev/sdb,并使用标签Instance1进行监控)。

---
- name: Adding Tag, Volumes, and cloud Watch Monitoring to an an instance
  hosts: web
  remote_user: ubuntu
  tasks:
    - name: Adding Tag, Volumes, and cloud Watch Monitoring to an an instance
      amazon.aws.ec2:
        instance_type: t2.micro
        image: ami-0b9064170e32bde34
        vpc_subnet_id: subnet-0dc9af4c75ad3e2ee
        region: us-east-2
        aws_access_key: AKIAVWOJMI5I2DXXXX
        aws_secret_key: F9PaprqnPUn/NP8lzQ5lWjXXXXXXXXXXXXXXXx
				# 创建卷并附加到 AWS EC2 实例(类型 io1)
        volumes:
          - device_name: /dev/sdb
            volume_type: io1
            iops: 1000
            volume_size: 100
				# 启用 CloudWatch 监控
				# 将要启动的 AWS EC2 实例的监控
        monitoring: yes
				# 对将要启动的 AWS EC2 实例进行标记
        instance_tags:
            Name: Instance1

2. 现在运行以下命令执行 playbook(advanced.yml),这将启动一个带有标签、卷和 CloudWatch 监控的 AWS EC2 实例。ansible-playbook advanced.yml

ansible-playbook advanced.yml
Executing the Ansible Playbook to Create an Instance with Tag, Volume, and Cloud Watch Monitoring

3. 导航到您想要验证的AWS EC2控制台实例的存储选项卡。在块设备下,单击列表中的一个卷ID以查看实例的详细信息。

Verifying the volume created in the AWS account for the AWS EC2 instance.

4. 最后,在实例摘要信息页面中单击标签选项卡。您将看到您在playbook中为实例设置的标签(步骤一中的标签),如下所示。

Verifying the tags in the AWS account for the AWS EC2 instance.

结论

在本教程中,您利用了Ansible AWS EC2模块以一个命令管理AWS EC2实例。您还学会了如何调整AWS EC2实例,如重新启动、终止、添加标签等。

现在您对Ansible AWS EC2模块有了扎实的了解,是否愿意将Ansible EC2 AWS模块纳入您的实例管理例行程序?也许您想通过添加一个cron作业来自动化任务?

Source:
https://adamtheautomator.com/ansible-ec2/