#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
помощью andec2_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
модуль были более тесно интегрированы.