Создание образов машин AWS EC2 (AMI) с помощью Packer и Ansible |
Если вы используете свои производственные виртуальные машины в AWS, скорее всего, вы сталкивались со сценариями, в которых вам необходимо создавать собственные образы компьютеров Amazon (AMI). AMI предоставляет информацию, необходимую для запуска экземпляра, которая может включать базовую операционную систему, зависимости приложения и другие необходимые библиотеки времени выполнения. Несколько экземпляров могут быть запущены из одного AMI с одинаковой конфигурацией.
Что такое Пакер?
Packer — это инструмент с открытым исходным кодом, используемый для создания образов машин для нескольких платформ из одной конфигурации. Это дает вам возможность создавать собственный AMI для использования на платформе AWS EC2.
Анзибль в миксе?
Инструмент управления конфигурацией Ansible будет использоваться в процессе сборки для настройки среды приложения, зависимостей и даже развертывания приложения в AMI. Этот процесс можно полностью автоматизировать для интеграции в конвейер CI/CD.
В этом уроке мы рассмотрим пример, который создает AMI с использованием Packer и Ansible. Для демонстрации мы будем использовать простое веб-приложение Java (WAR). Ansible будет использоваться для установки зависимостей веб-приложения Java и для развертывания файла WAR.
Шаг 1. Настройка зависимостей
- Система Linux/macOS для работы
- Установите Ансибл
Чтобы установить Ansible, используйте следующие команды.
###### CentOS / Fedora / RHEL ######
sudo yum -y install epel-release
wget https://bootstrap.pypa.io/pip/3.6/get-pip.py
sudo python3 get-pip.py
sudo pip3 install ansible
###### Ubuntu/Debian/Linux Mint ######
sudo apt update
sudo apt install -y software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt update
sudo apt install -y ansible
###### Arch/Manjaro ######
sudo pacman -S ansible
###### macOS ######
sudo easy_install pip
sudo pip install ansible
- Install Packer — установите последнюю версию Packer в Linux/FreeBSD/macOS/Windows.
- Установите и настройте инструмент AWS CLI: как установить и использовать AWS CLI в Linux
Не забудьте настроить AWS Идентификатор ключа доступа и Секретный ключ доступа, как показано в руководстве по установке.
После установки всего необходимого программного обеспечения перейдите к следующим разделам.
Шаг 2. Создайте скелет проекта
Давайте создадим каталог для нашего проекта.
mkdir -p ~/projects/packer-ansible-aws
cd ~/projects/packer-ansible-aws
В созданном каталоге создайте папки для Packer, поставщиков Ansible и место, где будут размещаться пакеты исходного кода/сборки приложения.
mkdir -p ~/projects/packer-ansible-aws/packer/provisioners/{ansible,scripts}
mkdir -p ~/projects/packer-ansible-aws/packer/provisioners/ansible/{templates,files}
mkdir -p ~/projects/packer-ansible-aws/src/application
Это мое первоначальное дерево проекта.
$ cd ~/projects/packer-ansible-aws
$ tree
.
├── packer
│ └── provisioners
│ ├── ansible
│ └── scripts
└── src
└── application
6 directories, 0 files
Шаг 3. Создайте шаблоны упаковщиков
Теперь мы можем создать json-файл упаковщика, который будет использоваться для создания образа AMI. Внутри файла Packer определены ключи. Мы будем использовать переменные, конструкторы и поставщики.
Создайте шаблон Packer, который будет использоваться.
cd packer
vim packer-build.json
Мое содержимое выглядит, как показано ниже.
{
"variables": {
"aws_access_key": "",
"aws_secret_key": "",
"ami_name": "tomcat-ami",
"aws_region": "us-east-1",
"ssh_username": "centos",
"vpc_id": "",
"subnet_id": ""
},
"builders": [{
"type": "amazon-ebs",
"access_key": "{{user `aws_access_key`}}",
"secret_key": "{{user `aws_secret_key`}}",
"region": "{{user `aws_region`}}",
"instance_type": "t2.micro",
"force_deregister": "true",
"ssh_username": "{{user `ssh_username`}}",
"communicator": "ssh",
"associate_public_ip_address": true,
"subnet_id": "{{user `subnet_id`}}",
"ami_name": "{{user `ami_name`}}",
"source_ami_filter": {
"filters": {
"virtualization-type": "hvm",
"name": "CentOS Linux 7 x86_64 HVM EBS *",
"root-device-type": "ebs"
},
"owners": ["679593333241"],
"most_recent": true
},
"run_tags": {
"Name": "packer-build-image"
}
}],
"provisioners": [{
"type": "shell",
"inline": "while [ ! -f /var/lib/cloud/instance/boot-finished ]; do echo 'Waiting for cloud-init...'; sleep 1; done"
},
{
"type": "shell",
"script": "./provisioners/scripts/bootstrap.sh"
},
{
"type": "ansible",
"playbook_file": "./provisioners/ansible/setup-server.yml"
},
{
"type": "ansible",
"playbook_file": "./provisioners/ansible/deploy_app.yml"
}]
}
В ключевом разделе variables установите необходимые переменные:
- aws_access_key и aws_secret_key – игнорируйте это, если оно настроено в разделе установки инструмента AWS CLI. Часто устанавливается в ~/.aws/credentials.
- ami_name – имя, которое будет присвоено AMI, созданному Packer.
- aws_region – регион, в котором будет создан временный экземпляр и сохранен созданный AMI.
- ssh_username – пользователь AMI SSH. Поскольку в качестве базового образа я использую образ CentOS 7, доступный на AWS, пользователем ssh по умолчанию является centos, а для Ubuntu используйте ubuntu.
- vpc_id и subnet_id – идентификатор VPC и идентификатор подсети, которые будут использоваться временным экземпляром, созданным упаковщиком. Он должен быть доступен с рабочей станции. Я рекомендую вам использовать общедоступную подсеть.
В разделе ключей builders установите:
- instance_type – тип экземпляра EC2, который будет использоваться при создании AMI.
- source_ami_filter: исходный AMI, используемый в качестве основы для вновь созданного образа машины. Его значением может быть идентификатор AMI или фильтр для получения идентификатора.
Более подробную информацию можно найти в документации AMI Builder.
В разделе provisioners укажите пути к вашим сценариям Bash и ролям Ansible, которые будут выполняться во время сборки.
Шаг 4. Создайте сценарии и сборники сценариев Ansible
Начнем со сценария, который подготовит сервер CentOS для размещения веб-приложения Java.
Мы установим Ansible на виртуальную машину с помощью сценария bash, который запускается до выполнения плейбуков Ansible.
$ vim ./provisioners/scripts/bootstrap.sh
#!/bin/bash
set -ex
# Add EPEL repository
sudo yum install -y epel-release
sudo yum install -y ansible
Сделайте скрипт исполняемым:
chmod +x ./provisioners/scripts/bootstrap.sh
Создайте файл с именем setup-server.yml внутри каталога provisioners/ansible.
vim ~/projects/packer-ansible-aws/packer/provisioners/ansible/setup-server.yml
Содержимое файла:
---
- name: Tomcat deployment playbook
hosts: 'all'
become: yes
become_method: sudo
tasks:
- name: Add EPEL repository
yum:
name: epel-release
state: present
- name: Update all packages
yum:
name: "*"
state: latest
- name: Install basic packages
yum:
name: ['epel-release', 'firewalld', 'vim', 'bash-completion', 'htop', 'tmux', 'screen', 'telnet', 'tree', 'wget', 'curl', 'git', 'python-firewall']
state: present
- name: Install Java
yum:
name: java-1.8.0-openjdk
state: present
- name: Add tomcat group
group:
name: tomcat
- name: Add "tomcat" user
user:
name: tomcat
group: tomcat
home: /usr/share/tomcat
createhome: no
system: yes
- name: Download Tomcat
get_url:
url: https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.75/bin/apache-tomcat-9.0.75.tar.gz
dest: /tmp/apache-tomcat-9.0.75.tar.gz
- name: Create a tomcat directory
file:
path: /usr/share/tomcat
state: directory
owner: tomcat
group: tomcat
- name: Extract tomcat archive
unarchive:
src: /tmp/apache-tomcat-9.0.75.tar.gz
dest: /usr/share/tomcat
owner: tomcat
group: tomcat
remote_src: yes
extra_opts: "--strip-components=1"
creates: /usr/share/tomcat/bin
- name: Copy tomcat service file
template:
src: templates/tomcat.service.j2
dest: /etc/systemd/system/tomcat.service
- name: Start and enable tomcat
service:
daemon_reload: yes
name: tomcat
state: started
enabled: yes
- name: Start and enable firewalld
service:
name: firewalld
state: started
enabled: yes
- name: Open tomcat port on the firewall
firewalld:
port: 8080/tcp
permanent: true
state: enabled
immediate: yes
when: "ansible_os_family == 'RedHat' and ansible_distribution_major_version == '7'"
handlers:
- name: restart tomcat
service:
name: tomcat
state: restarted
Нам также необходимо добавить службу Tomcat systemd в качестве шаблона.
cd ~/projects/packer-ansible-aws/packer/provisioners/ansible/templates/
vim tomcat.service.j2
Вставьте содержимое ниже в файл.
[Unit]
Description=Tomcat
After=syslog.target network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment=JAVA_HOME=/usr/lib/jvm/jre
Environment='JAVA_OPTS=-Djava.awt.headless=true'
Environment=CATALINA_HOME=/usr/share/tomcat
Environment=CATALINA_BASE=/usr/share/tomcat
Environment=CATALINA_PID=/usr/share/tomcat/temp/tomcat.pid
Environment='CATALINA_OPTS=-Xms256M -Xmx512M'
ExecStart=/usr/share/tomcat/bin/catalina.sh start
ExecStop=/usr/share/tomcat/bin/catalina.sh stop
[Install]
WantedBy=multi-user.target
Эти ansible playbook будут:
- Установите репозиторий EPEL на виртуальную машину CentOS 7, созданную Packer.
- Обновите все системные пакеты до последних версий.
- Установите базовые пакеты ОС – vim, firewalld, wget и т.д.
- Установить Яву 8
- Загрузите, установите и настройте Tomcat 8.5.x
- Запустите службу Tomcat и настройте firewalld.
В следующем сборнике сценариев будет развернут образец Java-приложения, упакованный в виде файла war. Его можно скачать здесь.
Итак, давайте начнем с загрузки образца военного приложения с веб-сайта Tomcat.
cd ~/projects/packer-ansible-aws/packer/provisioners/ansible/files
wget https://tomcat.apache.org/tomcat-9.0-doc/appdev/sample/sample.war
Затем создайте сборник сценариев для развертывания военного приложения в создаваемом AMI.
vim ~/projects/packer-ansible-aws/packer/provisioners/ansible/deploy_app.yml
Данные, которые необходимо заполнить:
---
- name: Deploy tomcat war application
hosts: 'all'
become: yes
become_method: sudo
tasks:
- name: Deploy war file to tomcat
copy:
src: files/sample.war
dest: /usr/share/tomcat/webapps/sample.war
owner: tomcat
mode: 0644
notify: restart tomcat
handlers:
- name: restart tomcat
service:
name: tomcat
state: restarted
Шаг 5. Запустите сборку Packer.
Давайте теперь создадим AMI и сохраним результаты в файл build_artifact.txt.
cd ~/projects/packer-ansible-aws/packer
packer build -machine-readable packer-build.json | tee build_artifact.txt
Пример вывода:
...................................................
1559285322,,ui,say,==> amazon-ebs: Force Deregister flag found%!(PACKER_COMMA) skipping prevalidating AMI Name
1559285327,,ui,message, amazon-ebs: Found Image ID: ami-02eac2c0129f6376b
1559285330,,ui,say,==> amazon-ebs: Creating temporary keypair: packer_5cf0ce47-7f3e-ded7-9053-0732a3789020
1559285332,,ui,say,==> amazon-ebs: Creating temporary security group for this instance: packer_5cf0ce54-366a-3221-906e-cd3f1af3c1ee
1559285335,,ui,say,==> amazon-ebs: Authorizing access to port 22 from [0.0.0.0/0] in the temporary security groups...
1559285337,,ui,say,==> amazon-ebs: Launching a source AWS instance...
1559285337,,ui,say,==> amazon-ebs: Adding tags to source instance
1559285337,,ui,message, amazon-ebs: Adding tag: "Name": "packer-build-image"
1559285339,,ui,message, amazon-ebs: Instance ID: i-0ffaa1eef9ea7966b
1559285339,,ui,say,==> amazon-ebs: Waiting for instance (i-0ffaa1eef9ea7966b) to become ready...
1559285374,,ui,say,==> amazon-ebs: Using ssh communicator to connect: 35.172.100.134
1559285374,,ui,say,==> amazon-ebs: Waiting for SSH to become available...
1559285449,,ui,say,==> amazon-ebs: Connected to SSH!
1559285449,,ui,say,==> amazon-ebs: Provisioning with shell script: /tmp/packer-shell051244737
1559285456,,ui,say,==> amazon-ebs: Provisioning with shell script: ./provisioners/scripts/bootstrap.sh
1559285460,,ui,error,==> amazon-ebs: + sudo yum install -y epel-release
................................................
1559285482,,ui,say,==> amazon-ebs: Provisioning with Ansible...
1559285483,,ui,say,==> amazon-ebs: Executing Ansible: ansible-playbook --extra-vars packer_build_name=amazon-ebs packer_builder_type=amazon-ebs -o IdentitiesOnly=yes -i /tmp/packer-provisioner-ansible406384377 /home/jmutai/projects/packer-ansible-aws/packer/provisioners/ansible/setup-server.yml -e ansible_ssh_private_key_file=/tmp/ansible-key463353218
1559285483,,ui,message, amazon-ebs:
1559285483,,ui,message, amazon-ebs: PLAY [Tomcat deployment playbook] **********************************************
1559285483,,ui,message, amazon-ebs:
1559285483,,ui,message, amazon-ebs: TASK [Gathering Facts] *********************************************************
1559285508,,ui,message, amazon-ebs: ok: [default]
1559285508,,ui,message, amazon-ebs:
1559285508,,ui,message, amazon-ebs: TASK [Add EPEL repository] *****************************************************
1559285553,,ui,message, amazon-ebs: ok: [default]
1559285553,,ui,message, amazon-ebs:
1559285553,,ui,message, amazon-ebs: TASK [Update all packages] *****************************************************
1559285564,,ui,message, amazon-ebs: ok: [default]
1559285564,,ui,message, amazon-ebs:
1559285564,,ui,message, amazon-ebs: TASK [Install basic packages] **************************************************
1559285595,,ui,message, amazon-ebs: changed: [default]
1559285595,,ui,message, amazon-ebs:
1559285595,,ui,message, amazon-ebs: TASK [Install Java] ************************************************************
1559285630,,ui,message, amazon-ebs: changed: [default]
1559285630,,ui,message, amazon-ebs:
1559285630,,ui,message, amazon-ebs: TASK [Add tomcat group] ********************************************************
1559285640,,ui,message, amazon-ebs: changed: [default]
1559285640,,ui,message, amazon-ebs:
1559285640,,ui,message, amazon-ebs: TASK [Add "tomcat" user] *******************************************************
1559285659,,ui,message, amazon-ebs: changed: [default]
1559285659,,ui,message, amazon-ebs:
1559285659,,ui,message, amazon-ebs: TASK [Download Tomcat] *********************************************************
1559285674,,ui,message, amazon-ebs: changed: [default]
1559285674,,ui,message, amazon-ebs:
1559285674,,ui,message, amazon-ebs: TASK [Create tomcat directory] *************************************************
1559285692,,ui,message, amazon-ebs: changed: [default]
1559285692,,ui,message, amazon-ebs:
1559285692,,ui,message, amazon-ebs: TASK [Extract tomcat archive] **************************************************
1559285724,,ui,message, amazon-ebs: changed: [default]
1559285724,,ui,message, amazon-ebs:
1559285724,,ui,message, amazon-ebs: TASK [Copy tomcat service file] ************************************************
1559285752,,ui,message, amazon-ebs: changed: [default]
1559285752,,ui,message, amazon-ebs:
1559285752,,ui,message, amazon-ebs: TASK [Start and enable tomcat] *************************************************
1559285772,,ui,message, amazon-ebs: changed: [default]
1559285772,,ui,message, amazon-ebs:
1559285772,,ui,message, amazon-ebs: TASK [Start and enable firewalld] **********************************************
1559285783,,ui,message, amazon-ebs: changed: [default]
1559285783,,ui,message, amazon-ebs:
1559285783,,ui,message, amazon-ebs: TASK [Open tomcat port on firewall] ********************************************
1559285796,,ui,message, amazon-ebs: changed: [default]
1559285796,,ui,message, amazon-ebs:
1559285796,,ui,message, amazon-ebs: PLAY RECAP *********************************************************************
1559285796,,ui,message, amazon-ebs: default : ok=14 changed=11 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
1559285796,,ui,message, amazon-ebs:
1559285796,,ui,say,==> amazon-ebs: Provisioning with Ansible...
1559285797,,ui,say,==> amazon-ebs: Executing Ansible: ansible-playbook --extra-vars packer_build_name=amazon-ebs packer_builder_type=amazon-ebs -o IdentitiesOnly=yes -i /tmp/packer-provisioner-ansible221665956 /home/jmutai/projects/packer-ansible-aws/packer/provisioners/ansible/deploy_app.yml -e ansible_ssh_private_key_file=/tmp/ansible-key672089113
1559285797,,ui,message, amazon-ebs:
1559285797,,ui,message, amazon-ebs: PLAY [Deploy tomcat war application] *******************************************
1559285797,,ui,message, amazon-ebs:
1559285797,,ui,message, amazon-ebs: TASK [Gathering Facts] *********************************************************
1559285811,,ui,message, amazon-ebs: ok: [default]
1559285811,,ui,message, amazon-ebs:
1559285811,,ui,message, amazon-ebs: TASK [Deploy war file to tomcat] ***********************************************
1559285832,,ui,message, amazon-ebs: changed: [default]
1559285832,,ui,message, amazon-ebs:
1559285832,,ui,message, amazon-ebs: RUNNING HANDLER [restart tomcat] ***********************************************
1559285846,,ui,message, amazon-ebs: changed: [default]
1559285846,,ui,message, amazon-ebs:
1559285846,,ui,message, amazon-ebs: PLAY RECAP *********************************************************************
1559285846,,ui,message, amazon-ebs: default : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
После завершения подготовки упаковщик остановит и уничтожит используемый временный экземпляр, а затем создаст AMI.
1559285846,,ui,message, amazon-ebs:
1559285846,,ui,say,==> amazon-ebs: Stopping the source instance...
1559285846,,ui,message, amazon-ebs: Stopping instance
1559285850,,ui,say,==> amazon-ebs: Waiting for the instance to stop...
1559285875,,ui,say,==> amazon-ebs: Creating AMI tomcat-ami from instance i-0ffaa1eef9ea7966b
1559285884,,ui,message, amazon-ebs: AMI: ami-0f6cc044e485adabf
1559285884,,ui,say,==> amazon-ebs: Waiting for AMI to become ready...
1559285967,,ui,say,==> amazon-ebs: Terminating the source AWS instance...
1559285986,,ui,say,==> amazon-ebs: Cleaning up any extra volumes...
1559285987,,ui,say,==> amazon-ebs: Destroying volume (vol-0e34552c157dc217f)...
1559285988,,ui,say,==> amazon-ebs: Deleting temporary security group...
1559285990,,ui,say,==> amazon-ebs: Deleting temporary keypair...
1559285991,,ui,say,Build 'amazon-ebs' finished.
1559285991,,ui,say,\n==> Builds finished. The artifacts of successful builds are:
1559285991,amazon-ebs,artifact-count,1
1559285991,amazon-ebs,artifact,0,builder-id,mitchellh.amazonebs
1559285991,amazon-ebs,artifact,0,id,us-east-1:ami-0f6cc044e485adabf
1559285991,amazon-ebs,artifact,0,string,AMIs were created:\nus-east-1: ami-0f6cc044e485adabf\n
1559285991,amazon-ebs,artifact,0,files-count,0
1559285991,amazon-ebs,artifact,0,end
1559285991,,ui,say,--> amazon-ebs: AMIs were created:\nus-east-1: ami-0f6cc044e485adabf\n
Все выходные данные подготовки будут записываться в файл build_artifact.txt внутри папки упаковщика. В конце печатается AMI ID — ami-0f6cc044e485adabf.
Шаг 6. Тестирование созданного AMI
В этом разделе я буду использовать Terraform для предоставления нового экземпляра с созданным AMI. То же самое можно сделать из консоли AWS.
Узнайте, как установить Terraform в Linux. Проверьте страницу выпусков для получения последней версии.
cd /tmp
export VER="1.4.6"
wget https://releases.hashicorp.com/terraform/${VER}/terraform_${VER}_linux_amd64.zip
unzip terraform_${VER}_linux_amd64.zip
sudo mv terraform /usr/local/bin/
terraform -v
Создайте каталог проектов terraform.
mkdir ~/projects/packer-ansible-aws/terraform
cd ~/projects/packer-ansible-aws/terraform
vim main.tf
Мой файл терраформирования main.tf выглядит следующим образом.
# Provider
provider "aws" {
region = "us-east-1"
}
# Create EC2 Test instance
resource "aws_instance" "test-instance" {
key_name = ""
subnet_id = ""
ami = ""
instance_type = "t2.micro"
associate_public_ip_address = "true"
disable_api_termination = "false"
monitoring = "false"
vpc_security_group_ids = ["${aws_security_group.test-sg.id}"]
tags {
Name = "test-instance"
}
}
# Create Test SG
resource "aws_security_group" "test-sg" {
vpc_id = ""
name = "test-sg"
description = "Test Security group"
tags {
Name = "test-sg"
}
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 0
to_port = 65535
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = -1
to_port = -1
protocol = "icmp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
Установите все необходимые значения, затем инициализируйте рабочий каталог Terraform.
$ terraform init
Initializing the backend...
Initializing provider plugins...
- Finding latest version of hashicorp/aws...
- Installing hashicorp/aws v5.1.0...
- Installed hashicorp/aws v5.1.0 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
Покажите план выполнения.
$ terraform plan
.......................
Plan: 2 to add, 0 to change, 0 to destroy.
------------------------------------------------------------------------
Наконец, создайте свою инфраструктуру в соответствии с файлами конфигурации Terraform в DIR.
$ terraform apply
......................
Plan: 2 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
aws_security_group.test-sg: Creating...
arn: "" => "<computed>"
description: "" => "Test Security group"
egress.#: "" => "1"
....................................................................
aws_security_group.test-sg: Still creating... (10s elapsed)
aws_security_group.test-sg: Creation complete after 11s (ID: sg-062a8615dd461fc1e)
aws_instance.test-instance: Creating...
..............................................
aws_instance.test-instance: Still creating... (10s elapsed)
aws_instance.test-instance: Still creating... (20s elapsed)
aws_instance.test-instance: Still creating... (30s elapsed)
aws_instance.test-instance: Still creating... (40s elapsed)
aws_instance.test-instance: Creation complete after 45s (ID: i-0bf06f3b3cbf99791)
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Создание нового экземпляра можно подтвердить на панели управления AWS EC2.
Получите IP-адрес экземпляра и доступ к сервисному порту. Тестовое Java-приложение должно быть доступно по адресу:
http://serverip:8080/sample/
Похоже на это:
Чтобы уничтожить вашу тестовую инфраструктуру, запустите:
$ terraform destroy
aws_security_group.test-sg: Refreshing state... (ID: sg-062a8615dd461fc1e)
aws_instance.test-instance: Refreshing state... (ID: i-0bf06f3b3cbf99791)
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
- destroy
Terraform will perform the following actions:
- aws_instance.test-instance
- aws_security_group.test-sg
Plan: 0 to add, 0 to change, 2 to destroy.
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
Тебе следует увидеть
aws_instance.test-instance: Destroying... (ID: i-0bf06f3b3cbf99791)
aws_instance.test-instance: Still destroying... (ID: i-0bf06f3b3cbf99791, 10s elapsed)
aws_instance.test-instance: Still destroying... (ID: i-0bf06f3b3cbf99791, 20s elapsed)
aws_instance.test-instance: Destruction complete after 25s
aws_security_group.test-sg: Destroying... (ID: sg-062a8615dd461fc1e)
aws_security_group.test-sg: Destruction complete after 2s
Destroy complete! Resources: 2 destroyed.
Вы узнали, как использовать Packer и Ansible для создания AWS AMI. Оставайтесь на связи, чтобы получать больше интересных уроков.
Похожий :
Лучшие решения для хранения данных для Kubernetes и Docker-контейнеров
Как сбросить/изменить пароль пользователя IAM на AWS
Как сбросить главный пароль пользователя RDS на AWS
Как расширить загрузочный диск EBS на AWS без перезагрузки экземпляра
Как подготовить виртуальные машины на KVM с помощью Terraform