Spec-Zone.ru › Ansible 2.7

Руководство по Amazon Web Services

Введение

Ansible содержит ряд модулей для управления Amazon Web Services (AWS). Цель данного раздела — объяснить, как объединить модули Ansible (и использовать скрипты инвентаризации) для использования Ansible в контексте AWS.

Требования к модулям AWS минимальны.

Все модули требуют и тестируются на последних версиях boto. Вам понадобится этот Python-модуль, установленный на вашем управляющем узле. Boto можно установить из дистрибутива вашей ОС или с помощью «pip install boto».

В то время как классически Ansible выполняет задачи в цикле хостов для нескольких удаленных машин, большинство операций по управлению облаком выполняются на вашем локальном компьютере со ссылкой на регионы для управления.

В ваших шагах playbook мы обычно будем использовать следующий шаблон для операций развертывания:

- 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 }}"

После создания группы хостов, второй этап в нижней части файла 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

Инвентаризация хостов

После запуска ваших узлов вы, вероятно, захотите с ними снова взаимодействовать. При настройке облака лучше не поддерживать статический список имен облачных хостов в текстовых файлах. Лучший способ для этого — использовать динамический скрипт инвентаризации ec2. См. Работа с динамической инвентаризацией.

Это также позволит динамически выбирать узлы, которые были созданы даже вне Ansible, и позволит Ansible их управлять.

См. Работа с динамической инвентаризацией для получения инструкций по использованию, затем вернитесь к этому разделу.

Тэги, группы и переменные

При использовании скрипта инвентаризации ec2 хосты автоматически появляются в группах на основе того, как они помечены в EC2.

Например, если хосту присвоен тэг «class» со значением «webserver», он будет автоматически обнаружен в динамической группе следующим образом:

- hosts: tag_class_webserver
  tasks:
    - ping

Использование этой философии может быть отличным способом разделения систем по выполняемой ими функции.

В этом примере, если мы хотим определить переменные, которые автоматически применяются к каждой машине с тегом «class» равным «webserver», можно использовать «group_vars» в Ansible. См. Разделение данных, специфичных для узла и группы.

Аналогичные группы доступны для регионов и других классификаций, и им аналогичным образом можно назначать переменные с помощью того же механизма.

Автомасштабирование с Ansible Pull

Функция Amazon Autoscaling автоматически увеличивает или уменьшает емкость в зависимости от нагрузки. В документации облака также показаны модули Ansible, которые могут настраивать политику autoscaling.

При появлении узлов может быть недостаточно ждать следующего цикла команды Ansible, чтобы настроить этот узел.

Для этого нужно создавать образы машин, которые содержат вызов ansible-pull. Ansible-pull — это командная утилита, которая извлекает playbook из сервера Git и выполняет его локально.

Одна из проблем этого подхода заключается в том, что необходимо централизованное хранение данных о результатах команд pull в контексте autoscaling. По этой причине представленное ниже решение автомасштабирования может быть лучшим подходом.

См. ansible-pull для получения дополнительной информации о playbook в режиме 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 playbooks совместно с различными программами для определения и загрузки базового образа, который затем получит свой собственный идентификатор AMI для использования с модулем ec2 или другими модулями Ansible AWS, такими как ec2_asg или модулем cloudformation. Возможные инструменты включают Packer, aminator и модуль Ansible ec2_ami.

Как правило, большинство пользователей используют Packer.

См. документацию Packer по локальному провайдеру Ansible для Packer и удаленному провайдеру Ansible для Packer.

Если вы пока не хотите использовать 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.7/scenario_guides/guide_aws.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API