Spec-Zone.ru › Ansible 2.9

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

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

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

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

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

Spec-Zone.ru

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