Руководство по Amazon Web Services
Введение
Ansible содержит ряд модулей для управления Amazon Web Services (AWS). Цель этого раздела — объяснить, как объединить модули Ansible (и использовать скрипты инвентаризации) для использования Ansible в контексте AWS.
Требования к модулям AWS минимальны.
Все модули требуют и тестируются с последними версиями boto. Вам потребуется этот Python-модуль, установленный на вашем управляющем компьютере. Boto можно установить из дистрибутива вашей операционной системы или с помощью «pip install boto» в Python.
В то время как традиционно 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.
Следующий пример демонстрирует, как гарантировать наличие только 5 экземпляров, помеченных как «Demo» в EC2.
В примере ниже «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'}] }}"
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 — это командная утилита, которая извлекает плейбук с сервера 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 вызывается через пользовательские данные после появления образа онлайн, или комбинация этих методов.
Дополнительную информацию см. в примерах модуля CloudFormation Ansible.
Создание образов AWS с Ansible
Многие пользователи захотят, чтобы образы загружались с более полной конфигурацией, а не настраивались полностью после инициализации. Для этого можно использовать различные программы с плейбуками Ansible для определения и загрузки базового образа, который затем получит собственный ID AMI для использования с модулем ec2 или другими модулями Ansible AWS, такими как ec2_asg или модулем cloudformation. Возможные инструменты включают Packer, aminator и модуль ec2_ami Ansible.
Как правило, большинство пользователей используют Packer.
См. документацию Packer по локальному провайдеру Ansible для Packer и удаленному провайдеру Ansible для Packer.
Если вы не хотите использовать Packer в настоящее время, приемлемо настроить базовый образ с Ansible после развертывания (как показано выше).
Следующие шаги: изучение модулей
Ansible поставляется с множеством модулей для настройки широкого спектра услуг EC2. Полный список с примерами можно найти в категории «Облако» в документации по модулям.
См. также
- Все модули
- Вся документация по модулям Ansible
- Работа с плейбуками
- Введение в плейбуки
- Делегирование, поэтапные обновления и локальные действия
- Делегирование, полезное при работе с балансировщиками нагрузки, облаками и локальными шагами.
- Список рассылки пользователей
- Есть вопрос? Заходите на форум!
- irc.freenode.net
- #ansible канал IRC чата
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.8/scenario_guides/guide_aws.html