Руководство по Amazon Web Services
Введение
Ansible содержит ряд модулей для управления Amazon Web Services (AWS). Цель этого раздела — объяснить, как объединить модули Ansible (и использовать скрипты инвентаризации) для использования Ansible в контексте AWS.
Требования к модулям AWS минимальны.
Все модули требуют и протестированы с последними версиями boto. Вам потребуется этот модуль Python, установленный на вашей управляющей машине. Boto можно установить из дистрибутива вашей ОС или с помощью команды python’s “pip install boto”.
В то время как традиционно Ansible выполняет задачи в цикле хостов на нескольких удаленных машинах, большинство действий по управлению облаком происходят на вашей локальной машине со ссылкой на регионы для управления.
В шагах вашей книги задач мы обычно будем использовать следующий шаблон для шагов подготовки:
- hosts: localhost
connection: local
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
connection: local
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
connection: local
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
Инвентаризация хостов
После запуска ваших узлов, вы, вероятно, захотите с ними связаться. В случае облачной среды лучше не поддерживать статический список имен облачных хостов в текстовых файлах. Лучший способ сделать это — использовать динамический скрипт инвентаризации ec2. См. Работа с динамической инвентаризацией.
Это также динамически выберет узлы, которые были созданы даже за пределами Ansible, и позволит Ansible их управлять.
См. Работа с динамической инвентаризацией, чтобы узнать, как это использовать, а затем вернуться к этому разделу.
Теги, группы и переменные
Например, если хосту задан тег «class» со значением «webserver», он будет автоматически обнаружен с помощью динамической группы следующим образом:
- hosts: tag_class_webserver
tasks:
- ping
Применение этой философии может быть отличным способом разделения систем по выполняемым ими функциям.
В этом примере, если мы захотим определить переменные, которые автоматически применяются к каждой машине, помеченной тегом «class» со значением «webserver», можно использовать «group_vars» в Ansible. См. Разделение данных по хостам и группам.
Аналогичные группы доступны для регионов и других классификаций, и им аналогичным образом можно назначить переменные с помощью того же механизма.
Автомасштабирование с Ansible Pull
Функция автоматического масштабирования Amazon автоматически увеличивает или уменьшает емкость в зависимости от нагрузки. В документации по облаку также показаны модули Ansible, которые могут настраивать политику автоматического масштабирования.
Когда узлы появляются онлайн, может быть недостаточно ждать следующего цикла команды Ansible, чтобы настроить этот узел.
Для этого предварительно подготовьте образы машин, содержащие вызов ansible-pull. Ansible-pull — это командная утилита, которая извлекает книгу задач из Git-сервера и выполняет её локально.
Одной из проблем этого подхода является то, что необходим централизованный способ хранения данных о результатах команд pull в контексте автоматического масштабирования. По этой причине представленное ниже в следующем разделе решение для автоматического масштабирования может быть лучшим подходом.
См. ansible-pull для получения дополнительной информации о книгах задач в режиме pull.
Автомасштабирование с Ansible Tower
Ansible Tower также содержит очень удобную функцию для случаев использования автоматического масштабирования. В этом режиме простой скрипт curl может вызывать определённый URL, и сервер будет «обращаться» к запрошивающему и настраивать экземпляр, который запускается. Это может быть отличным способом перенастройки временных узлов. Смотрите документацию по установке и продуктам Tower для получения дополнительной информации.
Преимущество использования обратной связи в Tower по сравнению с режимом pull заключается в том, что результаты задач по-прежнему централизованно регистрируются, и меньше информации необходимо передавать удалённым хостам.
Ansible с (и против) CloudFormation
CloudFormation — это технология Amazon для определения облачной стеки как JSON-документа.
Модули Ansible предоставляют более простой в использовании интерфейс, чем CloudFormation во многих примерах, без определения сложного JSON-документа. Это рекомендуется для большинства пользователей.
Однако для пользователей, которые решили использовать CloudFormation, существует модуль Ansible, который может быть использован для применения шаблона CloudFormation к Amazon.
При использовании Ansible с CloudFormation, Ansible обычно используется с инструментом, таким как Packer, для создания образов, а CloudFormation запускает эти образы, или Ansible вызывается через данные пользователя, как только появляется образ онлайн, или комбинация этих двух вариантов.
Для получения более подробной информации см. примеры в модуле Ansible CloudFormation.
Создание образов AWS с помощью Ansible
Многие пользователи могут захотеть, чтобы образы загружались с более полной конфигурацией, а не с её настройкой после запуска. Для этого можно использовать Ansible Playbook с различными программами, чтобы определить и загрузить базовый образ, который затем получит свой собственный идентификатор AMI для использования с модулем ec2 или другими модулями Ansible AWS, такими как ec2_asg или модулем cloudformation. К возможным инструментам относятся Packer, aminator и модуль ec2_ami Ansible.
В целом, мы видим, что большинство пользователей используют Packer.
См. документацию Packer по локальному провайдеру Ansible Packer и удаленному провайдеру Ansible Packer.
Если вы не хотите использовать Packer в данный момент, настройка базового образа с помощью Ansible после подготовки (как показано выше) приемлема.
Следующие шаги: изучение модулей
Ansible поставляется с множеством модулей для настройки широкого спектра услуг EC2. Ознакомьтесь с категорией «Облако» в документации модулей для получения полного списка с примерами.
См. также
- Все модули
- Вся документация для модулей Ansible
- Работа с книгами задач
- Введение в книги задач
- Делегирование, постепенные обновления и локальные действия
- Делегирование, полезно для работы с балансировщиками нагрузки, облаками и локально выполняемыми шагами.
- Список рассылки пользователей
- У вас есть вопрос? Зайдите на форум 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.5/scenario_guides/guide_aws.html