Spec-Zone.ru › Ansible 2.11

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

Введение

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

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

Все модули требуют и тестируются с последними версиями boto, обычно boto3. Обратитесь к документации модуля, чтобы узнать минимально необходимую версию для каждого модуля. На вашем управляющем компьютере должен быть установлен модуль Python boto3. Возможно, также потребуется исходный пакет boto. Эти модули можно установить из дистрибутива вашей ОС или с помощью установщика пакетов Python: pip install boto3.

В то время как 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 экземпляров, помеченных как «Демонстрация» в EC2, приведён ниже.

В примере ниже точное количество экземпляров устанавливается в 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'}] }}"
  loop: "{{ 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

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

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

Плагин также вернёт экземпляры, созданные вне Ansible, и позволит Ansible их управлять.

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

При использовании плагина инвентаризации вы можете настроить дополнительную структуру инвентаризации, основанную на метаданных, возвращаемых AWS.

Например, вы можете использовать keyed_groups для создания групп из тегов экземпляров:

plugin: aws_ec2
keyed_groups:
  - prefix: tag
    key: tags

Затем вы можете направить все экземпляры с тегом «class», значением которого является «webserver», в плейбук:

- hosts: tag_class_webserver
  tasks:
    - ping

Вы также можете использовать эти группы с 'group_vars', чтобы задавать переменные, которые автоматически применяются к соответствующим экземплярам. Смотрите Организация переменных хостов и групп.

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

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

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

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

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

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

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

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

Если вы не хотите использовать Packer в настоящее время, конфигурирование базового образа с помощью Ansible после развертывания (как показано выше) допустимо.

Дальнейшие действия: изучение модулей

Ansible поставляется с множеством модулей для настройки широкого спектра служб EC2. Полный список с примерами можно найти в категории «Облако» в документации по модулям.

См. также

Список коллекций

Просмотр существующих коллекций, модулей и плагинов

Работа с плейбуками

Введение в плейбуки

Управление местом выполнения задач: делегирование и локальные действия

Делегирование, полезно для работы с балансировщиками нагрузки, облаками и локально выполняемыми шагами.

Пользовательская почтовая рассылка

У вас есть вопросы? Загляните в группу Google!

irc.freenode.net

IRC-чат-канал #ansible

© 2012–2018 Michael DeHaan
© 2018–2021 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.11/scenario_guides/guide_aws.html

Spec-Zone.ru

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