Использование тега ec2 для создания аварийного сигнала метрики в ansible

#amazon-web-services #amazon-ec2 #ansible

#amazon-web-services #amazon-ec2 #ansible

Вопрос:

Я пытаюсь определить аварийный сигнал для каждого нового экземпляра, который я запускаю, используя скрипты ansible. Этого легко достичь с помощью:

- name: Create CPU utilization metric alarm
ec2_metric_alarm:
state: present
name: "cpu-low"
metric: "CPUUtilization"
statistic: Average
comparison: ">="
threshold: 80.0
unit: "Percent"
period: 300
evaluation_periods: 1
description: "It will be triggered when CPU utilization is more than 80% for 5 minutes"

Обратите внимание, что я использую cpu-low в качестве имени аварийного сигнала. Это не то, что я хочу, поскольку у меня может быть более одного экземпляра, вызывающего этот сигнал тревоги. Поэтому я хотел бы использовать тег ec2 'Name' , к которому я не знаю, как получить доступ.

Я пытался использовать:


- name: List resource tags
local_action: ec2_tag resource=XYZ state=list
tags: [metric-alarms]

Но для этого требуется идентификатор ресурса, которого у меня также нет. Возможно ли получить теги ec2 в скриптах ansible?

Ответ №1:

Это задача, которую я придумал, чтобы использовать имя экземпляра в имени аварийного сигнала:

 - name: Get instance ec2 facts
  action: ec2_facts
  register: ec2_facts

- name: Get resource tags from ec2 facts
  sudo: false
  local_action: ec2_tag
                resource={{ec2_facts.ansible_facts.ansible_ec2_instance_id}}
                region=us-east-1 state=list
  register: result

- name: Create CPU utilization metric alarm
  sudo: false
  local_action: ec2_metric_alarm
                state=present
                region=us-east-1
                name="{{result.Name}}-cpu-utilization"
                metric="CPUUtilization"
                statistic=Average comparison=">="
                threshold=80.0
                unit="Percent"
                period=300
                evaluation_periods=1
                description="It will be triggered when CPU utilization is more than 80% for 5 minutes"
                dimensions="InstanceId"="{{ec2_facts.ansible_facts.ansible_ec2_instance_id}}"
                alarm_actions=arn:aws:sns:us-east-1:123412341234:My_SNS_Notification
                ok_actions=arn:aws:sns:us-east-1:123412341234:My_SNS_Notification
  

Комментарии:

1. Вы также можете получить теги с помощью плагина инвентаризации EC2. Затем теги будут отображаться как переменные узла в форме ec2_tag_Name для тега «Name». Это может быть действительно удобно, но на практике это разочаровывает при подготовке игр, потому что AFAIK вы не можете перезагрузить его в памяти во время запуска Ansible, как вы можете с ec2_facts помощью and ec2_tag . Таким образом, при создании новых экземпляров эти hostvars еще не доступны позже в том же запуске. Я хотел бы, чтобы плагин и ec2_facts модуль инвентаризации EC2 были более тесно интегрированы.

2. Пошел дальше и опубликовал отдельный ответ, поскольку я думаю, что он показывает шаблон, который часто бывает полезен в других контекстах. Для обеспечения я думаю, что выборка результатов с ec_tag помощью модуля, к сожалению, все еще может быть лучшим способом.

3. Что state=list здесь делать?

4. В качестве документации ( docs.ansible.com/ec2_tag_module.html ) говорит: Use list to interrogate the tags of an instance.

Ответ №2:

С плагином инвентаризации EC2 теги намного удобнее, чем все register манипуляции, но у него также есть некоторые оговорки. С помощью плагина теги назначаются как переменные узла с ec2_tag пространством имен. Ваши определения предупреждений могут выглядеть примерно так:

 - name: Set up metric alerts
  hosts: 127.0.0.1
  connection: local

  tasks:
    - name: Create CPU utilization metric alarm
      ec2_metric_alarm:
      args:
        state: present
        name: '{{ hostvars[item].ec_tag_Name }}'
        metric: CPUUtilization
        statistic: Average
        comparison: ">="
        threshold: 80.0
        unit: Percent
        period: 300
        evaluation_periods: 1
        description: >
          Triggered when CPU utilization is more than
          80% for 5 minutes
      with_items: groups['your_targets']
  

Это еще проще, когда вы выполняете обычные удаленные воспроизведения (нет local_action ), поскольку обычно вам не требуется hostvars[item] цикл, вы просто ссылаетесь ec2_tag_Name на хост, который в данный момент настраивается.

Теперь обратная сторона: в качестве плагина инвентаризации AFAIK невозможно обновить данные в памяти во время одного запуска Ansible. Это означает, что при использовании Ansible для подготовки, если вы запускаете новые экземпляры EC2 с воспроизведением, ec2_tag_Foo переменные не будут доступны в последующих воспроизведениях, пока вы не запустите ansible-playbook второй раз и, возможно, не ec2.py --refresh-cache обновите локально кэшированные данные. Это прискорбно. Я бы хотел, чтобы плагин инвентаризации и ec2_facts модуль были более тесно интегрированы.