Spec-Zone.ru › Ansible 2.8

Руководство по 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 их управлять.

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

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

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

Например, если хосту присвоен тег «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

Spec-Zone.ru

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