Руководство по Amazon Web Services
Введение
Ansible содержит ряд модулей для управления Amazon Web Services (AWS). Цель этого раздела — объяснить, как объединить Ansible-модули (и использовать скрипты инвентаризации) для использования Ansible в контексте AWS.
Требования к модулям AWS минимальны.
Все модули требуют и протестированы с последними версиями boto. Вам потребуется этот модуль Python, установленный на вашей управляющей машине. Boto можно установить из дистрибутива вашей операционной системы или с помощью «pip install boto».
В то время как классически Ansible выполняет задачи в цикле хостов на нескольких удалённых машинах, большинство действий по управлению облаком выполняются на вашей локальной машине со ссылкой на регионы для управления.
В шагах вашего playbook мы будем обычно использовать следующую структуру для шагов подготовки:
- 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 }}"
После создания группы хостов, второй playbook в нижней части того же файла подготовки может содержать шаги конфигурации:
# 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'}] }}"
with_items: "{{ 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
Инвентаризация хостов
После запуска ваших узлов, вам, вероятно, понадобится с ними снова взаимодействовать. В случае с облачными настройками лучше не поддерживать статический список имён облачных хостов в текстовых файлах. Лучший способ сделать это — использовать скрипт динамической инвентаризации 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 — это командная утилита, которая извлекает playbook из сервера git и запускает его локально.
Одна из проблем этого подхода заключается в том, что необходим централизованный способ хранения данных о результатах команд pull в контексте автоматического масштабирования. По этой причине приведенное ниже в следующем разделе решение для автоматического масштабирования может быть лучшим подходом.
Прочитайте ansible-pull для получения дополнительной информации о playbook в режиме 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 playbooks для определения и загрузки базового образа, который затем получит свой собственный ID AMI для использования с модулем ec2 или другими Ansible AWS-модулями, такими как ec2_asg или модулем cloudformation. Возможные инструменты включают Packer, aminator и Ansible ec2_ami-модуль.
В общем случае большинство пользователей используют Packer.
См. документацию Packer по локальному провайдеру Packer Ansible и удалённому провайдеру Packer Ansible.
Если вы не хотите использовать Packer в данный момент, настройка базового образа с Ansible после подготовки (как показано выше) приемлема.
Следующие шаги: Исследуйте модули
Ansible поставляется с большим количеством модулей для настройки широкого спектра EC2-сервисов. Полный список с примерами можно найти в категории «Облако» в документации модулей.
См. также
- Все модули
- Вся документация по Ansible-модулям
- Работа с Playbook
- Вводный курс по playbook
- Делегирование, развертывание обновлений и локальные действия
- Делегирование, полезно для работы с балансировщиками, облаками и локальными шагами.
- Список рассылки пользователей
- Есть вопрос? Зайдите на 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.9/scenario_guides/guide_aws.html