如何使用 Ansible EC2 AWS 模塊管理虛擬機器

當您管理現有的Amazon Web Service (AWS) EC2實例時,點選管理控制台是可以正常工作的。但隨著基礎架構的擴大,管理實例將花費大量時間並變得複雜。是否有更好的方法來管理實例呢?是的!AWS Ansible EC2模組可以幫助您。

在本教程中,您將學習如何使用Ansible AWS EC2模組以示例驅動的方式強大地管理AWS EC2實例。

繼續閱讀並開始吧!

先決條件

本教程包含逐步指示。如果您想跟著進行,請確保您擁有以下條件:

  • 一個Ansible控制主機 – 本教程使用在Ubuntu 20.04.3 LTS機器上的Ansible v2.11.7。
  • 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

使用Ansible Playbook启动EC2实例

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

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

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

mkdir ~/ansible_aws_ec2_module
cd ~/ansible_aws_ec2_module

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

下面的playbook包含一个任务,该任务在AWS帐户中的特定VPC中启动具有公共IP地址的实例。

从本教程开始,使用您自己的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
				# 定義 instance_type、image、vpc_subnet_id、assign_public_ip、aws_region
        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
  # 使用Remote用户为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. 最后,在您的Web浏览器中导航到AWS实例,您将看到成功停止的两个实例,如下所示。

Viewing Stopped Instances

创建具有标签、卷和Cloud Watch监控的实例

也许您需要使用更高级的组件来配置您的实例,例如标记、使用云监控警报进行监视,以及为存储目的创建卷。在这种情况下,使用Ansible EC2 AWS模块在playbook中会很方便。

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

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

下面的playbook将使用(volumes—> /dev/sdb)启动一个带有监视和标记为Instance1的AWS EC2实例。

---
- 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
				# 启用即将启动的AWS EC2实例的云监控
				# AWS EC2实例的云监控
        monitoring: yes
				# 标记即将启动的AWS EC2实例
        instance_tags:
            Name: Instance1

2. 现在运行以下命令执行playbook(advanced.yml),将启动一个带有标记、卷和云监控的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/