Всем привет! Прошло много времени с момента моего последнего поста (2 месяца назад), но сегодня у меня есть интересная тема для обсуждения. На самом деле я уже говорил об этой теме на мероприятии AWS UG Indonesia, но сессия была на индонезийском языке (вот видео), поэтому я подумал о том, чтобы превратить его в сообщение в блоге на английском языке.

Хорошо! Возможно, вы заметили, что в этом блоге я в основном говорил об Ansible для AWS, но сейчас я расскажу о них с другой стороны, где мы можем их комбинировать. На самом деле они могут быть «друзьями» и не всегда должны быть сравнениями. Эти работы могут помочь вам сделать больше автоматизации для ваших ресурсов AWS, а это значит, что у вас будет больше времени, чтобы насладиться кофе 🙂 Я имею в виду, что всем это нравится, верно?


1. Динамическая инвентаризация для инстансов EC2

Да, мы обычно управляем инвентаризацией наших серверов вручную, когда мы вручную вводим IP-адреса или имена хостов, как показано ниже:

ec2:
  hosts:
    108.136.226.235:
    108.136.226.232:
    108.136.226.238:
Войти в полноэкранный режим

Выйти из полноэкранного режима

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

Чтобы использовать этот плагин, выполните следующие действия:

  • Создайте новый файл yaml и введите код ниже:
plugin: aws_ec2
regions:
- ap-southeast-3
filters:
availability-zone: ap-southeast-3b
Войти в полноэкранный режим

Выйти из полноэкранного режима

Это позволит нам получить данные EC2 и создать группу для наших экземпляров на основе используемого нами фильтра. Например, выше, мне нужно управлять инстансами EC2 в регионе Джакарта, и я добавил фильтр AZ, потому что мне просто нужно управлять инстансами в AZ B. Любой фильтр, который мы можем использовать, точно такой же, как мы используем фильтр EC2 с помощью AWS CLI. (если мы можем использовать фильтр с помощью AWS CLI EC2, то мы можем использовать его и в этом плагине).

  • После создания файла выполните команду:
ansible-inventory -i aws_ec2.yml --list
Войти в полноэкранный режим

Выйти из полноэкранного режима

Вот пример вывода:

"aws_ec2": {
  "hosts": [
    "ec2-108-136-56-235.ap-southeast-3.compute.amazonaws.com"
  ]
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

  • Если мы просто хотим увидеть группировку, запустите команду:
ansible-inventory -i aws_ec2.yml --graph
Войти в полноэкранный режим

Выйти из полноэкранного режима

Вот пример вывода:

@all
  |--@aws_ec2:
  |  |--ec2-108-136-56-235.ap-southeast-3.compute.amazonaws.com
  |--@ungrouped:
Войти в полноэкранный режим

Выйти из полноэкранного режима

  • Если мы хотим запустить какую-то команду или playbook для наших экземпляров, например, чтобы установить на них приложение, мы можем упомянуть инвентарь так же, как обычно используем Ansible. Ниже приведен пример запуска ansible ad-hoc, и мы увидим результат, когда это будет сделано.
ansible -i aws_ec2.yml -u ubuntu -m shell -a "sudo apt install apache2 -y"
Войти в полноэкранный режим

Выйти из полноэкранного режима

Теперь мы все видим, как легко нам управлять нашими инстансами EC2. Подробнее об этом плагине вы можете найти здесь.


2. Запуск AWS CloudFormation с помощью Ansible

В этой концепции мы автоматизируем инструмент AWS IaC. Как мы все знаем, CloudFormation предоставляет нам простой способ предоставления инфраструктуры на AWS в файл, просто отправляя шаблон. Звучит здорово, верно? Но знаете ли вы, что у Ansible есть модуль для этого?

Ага! У Ansible есть, и мы можем получить некоторые преимущества, комбинируя их. Как я упоминал ранее, они не всегда должны быть сравнениями, но будет лучше проводить их вместе.

Что мы можем с ними сделать?

  • Создание нескольких стеков одновременно

Если мы хотим создать несколько стеков с одинаковыми ресурсами вместе с их собственными значениями, мы можем сделать это с помощью Ansible. Нам не нужно копировать и вставлять один и тот же шаблон только для одних и тех же ресурсов. Все, что нам нужно сделать, это просто превратить его в переменную. Давайте посмотрим, как это работает!

Вот пример задачи, которую мы можем использовать. Ключ — это template_body аргумент, который позволяет нам использовать шаблон jinja2. В этом случае я хочу создать ведро в двух стеках, и у каждого стека есть свое имя стека и имя ведра. Итак, в stack1 Я хочу создать корзину с именем nuruls3 и для stack2имя корзины dhonas3.

    - name: create cloudformation stacks
      amazon.aws.cloudformation:
        stack_name: "{{ item.name }}"
        state: present
        template_body: "{{ lookup('template', 'cf-template.yml.j2') }}"
      loop:
        - { name: stack1, bucket: nuruls3 }
        - { name: stack2, bucket: dhonas3 }
Войти в полноэкранный режим

Выйти из полноэкранного режима

Как выглядит шаблон? Это так же просто, как это. Мы превращаем имя ведра, тип данных которого является строкой, в переменную.

Resources:
  S3Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      BucketName: "{{ item.bucket }}"
Войти в полноэкранный режим

Выйти из полноэкранного режима

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

Вот результат:

TASK [create a cloudformation stack] *******************************************
changed: [localhost] => (item={'name': 'stack1', 'bucket': 'nuruls3'})
changed: [localhost] => (item={'name': 'stack2', 'bucket': 'dhonas3'})
Войти в полноэкранный режим

Выйти из полноэкранного режима

и результат:

Стеки CloudFormation, созданные Ansible

$ aws s3 ls
2022-10-30 11:08:19 dhonas3
2022-10-30 11:07:51 nuruls3
Войти в полноэкранный режим

Выйти из полноэкранного режима

Примечание. Мы также можем выполнять обновление и удаление, а также создание. Подробнее об этом модуле нажмите здесь!

  • Создайте стек, содержащий ресурсы в разных учетных записях (если у вас их несколько).

Это пример из документации Ansible:

- name: Create a stack set with instances in two accounts
  community.aws.cloudformation_stack_set:
    name: my-stack
    description: Test stack in two accounts
    state: present
    template_url: 
    accounts: [1234567890, 2345678901]
    regions:
    - us-east-1
Войти в полноэкранный режим

Выйти из полноэкранного режима

На этом этапе я не могу воспроизвести его, потому что у меня есть только одна учетная запись, и я думаю, что мне не нужно создавать новую, чтобы сделать это 🙂 мне достаточно иметь ее, потому что она предназначена только для личного использования. но если вам нужно использовать его, потому что у вас более одной учетной записи, позвольте мне дать вам несколько советов. Для меня вместо использования template_url который вы должны загрузить в корзину S3, вы можете использовать template_body. Почему? Потому что вы сможете сделать что-то более гибкое. Например, вы можете использовать шаблон jinja2, где вы можете свободно настраивать параметры.


3. Запуск Ansible из AWS Systems Manager

SSM — отличная вещь для управления нашими инстансами EC2, и хорошо то, что мы можем запускать Ansible playbook из SSM.

Все, что нам нужно сделать, это просто прикрепить роль IAM к вашим инстансам EC2, которыми вы хотите управлять, что позволит им взаимодействовать с SSM, или, мы можем сказать, чтобы SSM-Agent, установленный на инстансах EC2, работал. Ага! Для последней версии AMI SSM-Agent уже установлен по умолчанию, поэтому нам не нужно устанавливать его снова (см. полную информацию здесь).

Еще одна вещь, которую нам нужно сделать, это установить Ansible на наши экземпляры EC2, потому что он будет работать на ваших экземплярах, которые действуют как хост Ansible, поэтому его следует установить.
(Это действие может быть выполнено с помощью SSM, а также с помощью SSM RunCommand, но в этом случае мы используем Shell).

Здесь мы будем использовать RunCommand с документом RunAnsiblePlaybook из Systems Manager и AFAIK можно бесплатно выполнить RunCommand, так что это может быть одной из ваших альтернатив для запуска Ansible вместо использования вашего локального хоста.

Команда запуска AWS SSM

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

AWS SSM RunAnsiblePlaybook

Если вы хотите запустить его с помощью AWS CLI, ниже приведен пример:

aws ssm send-command --document-name "AWS-RunAnsiblePlaybook" --document-version "1" --targets '[{"Key":"InstanceIds","Values":[your-instances-ids]}]' --parameters '{"playbook":["hosts: localhost\ntasks:\n - name: install web server\n apt: name=apache2"],"playbookurl":[""],"extravars":["SSM=True"],"check":["False"],"timeoutSeconds":["3600"]}' --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region ap-southeast-3
Войти в полноэкранный режим

Выйти из полноэкранного режима

Хорошо! Это три крутые вещи, которые мы можем сделать с помощью Ansible для автоматизации наших ресурсов AWS. Я надеюсь, что это может помочь вам продлить время, наслаждаясь кофе :), вместо того, чтобы тратить больше времени на работу для вашей системы (просто позвольте им работать на вас).

Это все на данный момент! Спасибо, что пришли, и я с нетерпением жду ваших отзывов. Подпишитесь на меня, чтобы получать уведомления, когда мой новый пост будет опубликован!