Руководство по Amazon Web Services
Введение
Ansible содержит ряд модулей для управления Amazon Web Services (AWS). Цель этого раздела — объяснить, как объединять модули Ansible (и использовать скрипты инвентаризации) для использования Ansible в контексте AWS.
Требования к модулям AWS минимальны.
Все модули требуют и тестируются с последними версиями boto. Вам потребуется этот модуль Python, установленный на вашей управляющей машине. Boto можно установить из дистрибутива вашей ОС или с помощью команды «pip install boto» из Python.
В то время как классически 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
with_items: "{{ 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», в Ansible можно использовать «group_vars». См. Разделение данных, специфичных для хостов и групп.
Аналогичные группы доступны для регионов и других классификаций, и им также можно аналогичным образом назначать переменные с помощью того же механизма.
Автомасштабирование с 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 для определения и загрузки базового образа, который получит свой собственный идентификатор AMI для использования с модулем ec2 или другими модулями Ansible AWS, такими как ec2_asg или модулем cloudformation. Возможные инструменты включают Packer, aminator и модуль Ansible ec2_ami.
Как правило, большинство пользователей используют Packer.
См. документацию Packer по локальному провайдеру Ansible Packer и удаленному провайдеру Ansible Packer.
Если вы не хотите использовать Packer в данный момент, настройка базового образа с помощью Ansible после развертывания (как показано выше) приемлема.
Дальнейшие шаги: изучение модулей
Ansible поставляется с множеством модулей для настройки широкого спектра служб EC2. Полный список с примерами см. в категории «Облако» документации модулей.
См. также
- О модулях
- Вся документация по модулям Ansible
- Книги задач
- Введение в книги задач
- Делегирование, обновление по частям и локальные действия
- Делегирование, полезное для работы с балансировщиками нагрузки, облаками и локально выполняемыми действиями.
- Список рассылки пользователей
- Есть вопросы? Заходите на форум!
- 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.4/guide_aws.html