Руководство по Amazon Web Services
Введение
Ansible содержит ряд модулей для управления Amazon Web Services (AWS). Цель данного раздела — объяснить, как объединить модули Ansible (и использовать скрипты инвентаризации) для использования Ansible в контексте AWS.
Требования к модулям AWS минимальны.
Все модули требуют и тестируются с последними версиями boto, обычно boto3. Обратитесь к документации по модулю, чтобы узнать минимально необходимую версию для каждого модуля. Модуль boto3 Python должен быть установлен на вашей управляющей машине. Возможно, потребуется и исходный пакет boto. Вы можете установить эти модули из дистрибутива вашей ОС или с помощью установщика пакетов Python: pip install boto3.
В то время как классически Ansible выполняет задачи в цикле хостов на нескольких удалённых машинах, большинство действий по управлению облаком происходят на вашей локальной машине со ссылкой на регионы для управления.
В ваших шагах книги задач мы обычно будем использовать следующую схему для этапов развертывания:
- hosts: localhost
gather_facts: False
tasks:
- ...
Авторизация
Авторизация с помощью модулей, связанных с AWS, выполняется путём указания вашего ключа доступа и секретного ключа как переменных среды или аргументов модуля.
Для переменных среды:
export AWS_ACCESS_KEY_ID='AK123' export AWS_SECRET_ACCESS_KEY='abc123'
Для хранения этих данных в файле vars_file, желательно зашифрованном с помощью ansible-vault:
--- ec2_access_key: "--REMOVED--" ec2_secret_key: "--REMOVED--"
Обратите внимание, что если вы храните свои учетные данные в файле vars_file, вам необходимо ссылаться на них в каждом модуле AWS. Например:
- ec2
aws_access_key: "{{ec2_access_key}}"
aws_secret_key: "{{ec2_secret_key}}"
image: "..."
Развертывание
Модуль ec2 развертывает и удаляет экземпляры в EC2.
Следующий пример демонстрирует, как убедиться, что в EC2 существует только 5 экземпляров, помеченных «Demo».
В примере ниже параметр «exact_count» экземпляров устанавливается в 5. Это означает, что если уже существуют 0 экземпляров, будет создано 5 новых экземпляров. Если уже есть 2 экземпляра, будет создано только 3, а если 8 экземпляров, то будет удалено 3 экземпляра.
Подсчёт производится с использованием параметра «count_tag». Параметр «instance_tags» используется для применения тегов к новосозданному экземпляру.:
# demo_setup.yml
- hosts: localhost
gather_facts: False
tasks:
- name: Provision a set of instances
ec2:
key_name: my_key
group: test
instance_type: t2.micro
image: "{{ ami_id }}"
wait: true
exact_count: 5
count_tag:
Name: Demo
instance_tags:
Name: Demo
register: ec2
Данные о созданных экземплярах сохраняются ключевым словом «register» в переменной с именем «ec2».
Из этого мы будем использовать модуль add_host для динамического создания группы хостов, состоящей из этих новых экземпляров. Это позволяет выполнять действия по настройке хостов непосредственно в последующей задаче:
# demo_setup.yml
- hosts: localhost
gather_facts: False
tasks:
- name: Provision a set of instances
ec2:
key_name: my_key
group: test
instance_type: t2.micro
image: "{{ ami_id }}"
wait: true
exact_count: 5
count_tag:
Name: Demo
instance_tags:
Name: Demo
register: ec2
- name: Add all instance public IPs to host group
add_host: hostname={{ item.public_ip }} groups=ec2hosts
loop: "{{ ec2.instances }}"
После создания группы хостов второй раздел в нижней части файла книги задач по развертыванию может содержать шаги по настройке:
# demo_setup.yml
- name: Provision a set of instances
hosts: localhost
# ... AS ABOVE ...
- hosts: ec2hosts
name: configuration play
user: ec2-user
gather_facts: true
tasks:
- name: Check NTP service
service: name=ntpd state=started
Группы безопасности
Группы безопасности в AWS являются состоятельными. Ответ на запрос от вашего экземпляра разрешается передавать независимо от правил входящих групп безопасности, и наоборот. В случае, если вы хотите разрешить трафик только от сервиса AWS S3, вам необходимо получить текущие диапазоны IP-адресов AWS S3 для одного региона и применить их как правило исходящего трафика.:
- name: fetch raw ip ranges for aws s3
set_fact:
raw_s3_ranges: "{{ lookup('aws_service_ip_ranges', region='eu-central-1', service='S3', wantlist=True) }}"
- name: prepare list structure for ec2_group module
set_fact:
s3_ranges: "{{ s3_ranges | default([]) + [{'proto': 'all', 'cidr_ip': item, 'rule_desc': 'S3 Service IP range'}] }}"
loop: "{{ raw_s3_ranges }}"
- name: set S3 IP ranges to egress rules
ec2_group:
name: aws_s3_ip_ranges
description: allow outgoing traffic to aws S3 service
region: eu-central-1
state: present
vpc_id: vpc-123456
purge_rules: true
purge_rules_egress: true
rules: []
rules_egress: "{{ s3_ranges }}"
tags:
Name: aws_s3_ip_ranges
Инвентаризация хостов
После запуска ваших узлов вам, вероятно, потребуется с ними снова взаимодействовать. В случае облачной настройки лучше не хранить статический список имён облачных хостов в текстовых файлах. Лучшим способом является использование плагина инвентаризации aws_ec2. См. Работа с динамической инвентаризацией.
Плагин также вернёт экземпляры, которые были созданы за пределами Ansible, и позволит Ansible управлять ими.
Теги, группы и переменные
Например, вы можете использовать keyed_groups для создания групп из тегов экземпляров:
plugin: aws_ec2
keyed_groups:
- prefix: tag
key: tags
Затем вы можете нацелить все экземпляры с тегом «class», значение которого равно «webserver», в книге задач:
- hosts: tag_class_webserver
tasks:
- ping
Вы также можете использовать эти группы с ‘group_vars’, чтобы задавать переменные, которые автоматически применяются к соответствующим экземплярам. См. Организация переменных хостов и групп.
Автомасштабирование с Ansible Pull
Функция Amazon Autoscaling автоматически увеличивает или уменьшает емкость в зависимости от нагрузки. В документации по облаку также показаны модули Ansible, которые могут настроить политику автомасштабирования.
Когда узлы становятся доступными, может быть недостаточно ждать следующего цикла команды ansible, чтобы настроить этот узел.
Для этого можно предварительно создать образы машин, содержащие необходимую вызов ansible-pull. Ansible-pull — это командная утилита, которая получает книгу задач с сервера Git и выполняет её локально.
Одна из проблем этого подхода заключается в том, что должна существовать централизованный способ хранения данных о результатах команд pull в контексте автомасштабирования. По этой причине представленное ниже в следующем разделе решение для автомасштабирования может быть лучшим подходом.
Для получения дополнительной информации о книгах задач в режиме pull см. ansible-pull.
Автомасштабирование с Ansible Tower
Red Hat Ansible Tower также содержит очень удобную функцию для использования в сценариях автомасштабирования. В этом режиме простой скрипт curl может вызывать определённый URL, и сервер «обращается» к запросу и настраивает экземпляр, который запускается. Это может быть отличным способом переконфигурировать временные узлы. Подробнее см. в документации по установке и продуктам Tower.
Преимущество использования обратного вызова в Tower по сравнению с режимом pull заключается в том, что результаты задач по-прежнему записываются централизованно, и удалённым хостам нужно передавать меньше информации.
Ansible с (и против) CloudFormation
CloudFormation — это технология Amazon для определения облачного стека как JSON- или YAML-документа.
Модули Ansible предоставляют более удобный интерфейс, чем CloudFormation во многих примерах, без определения сложного JSON-/YAML-документа. Это рекомендуется для большинства пользователей.
Однако для пользователей, которые решили использовать CloudFormation, существует модуль Ansible, который можно использовать для применения шаблона CloudFormation к Amazon.
При использовании Ansible с CloudFormation, как правило, Ansible используется с инструментом, таким как Packer, для создания образов, а CloudFormation запускает эти образы, или Ansible вызывается через пользовательские данные после запуска образа, или их комбинация.
Дополнительные сведения см. в примерах модуля Ansible CloudFormation.
Создание образов AWS с помощью Ansible
Многие пользователи могут захотеть, чтобы образы загружались с более полной конфигурацией, а не настраивались полностью после запуска. Для этого можно использовать различные программы с книгами задач Ansible для определения и загрузки базового образа, который затем получит свой собственный идентификатор AMI для использования с модулем ec2 или другими модулями Ansible AWS, такими как ec2_asg или модуль cloudformation. Возможные инструменты включают Packer, aminator и модуль Ansible ec2_ami.
В целом, большинство пользователей используют Packer.
См. документацию Packer по локальному провайдеру Packer Ansible и удаленному провайдеру Packer Ansible.
Если вы не хотите использовать Packer в данный момент, приемлема настройка базового образа с помощью Ansible после развертывания (как показано выше).
Следующие шаги: изучение модулей
Ansible поставляется с множеством модулей для настройки широкого спектра сервисов EC2. Для получения полного списка с примерами перейдите в категорию «Облако» в документации по модулям.
См. также
- Индекс коллекций
-
Просмотрите существующие коллекции, модули и плагины
- Работа с книгами задач
-
Введение в книги задач
- Управление местом выполнения задач: делегирование и локальные действия
-
Делегирование, полезное для работы с балансировщиками нагрузки, облаками и локальными этапами выполнения.
- Пользовательский список рассылки
-
Есть вопрос? Загляните в группу Google!
- irc.freenode.net
-
IRC-чат-канал #ansible
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.10/scenario_guides/guide_aws.html