2016-03-11 17 views
0

Я обнаружил довольно специфическую проблему при настройке аварийных сигналов AWS CloudWatch через возможность использования динамического инвентаря ec2.Как получить файловую систему через динамический инвентарь AWS EC2

Я успешно настроил aws-script-mon для контроля использования дисковых и ОЗУ на моих машинах.

Также мне удалось установить аварийные сигналы для использования ОЗУ с помощью незаменимого модуля ec2_metric_alarm.

Проблема, с которой я столкнулся в данный момент, заключается в том, что при настройке аварийных сигналов для использования диска требуется параметр размера Filesystem, но не возвращен в переменные ec2 dynamic inventory.

Некоторые из моих машин имеют файловую систему, установленную на /dev/xvda1, а в других - что-то вроде: /dev/disk/by-uuid/abcd123-def4-....

Мое текущее «решение» выглядят следующим образом:

- name: "Disk > 60% (filesystem by fixed uuid)" 
    ec2_metric_alarm: 
    state: present 
    name: "{{ ec2_tag_Name }}-Disk" 
    region: "{{ ec2_region }}" 
    dimensions: 
     InstanceId: '{{ ec2_id }}' 
     MountPath: "/" 
     Filesystem: '/dev/disk/by-uuid/abcd123-def4-...' 
    namespace: "System/Linux" 
    metric: DiskSpaceUtilization 
    statistic: Average 
    comparison: ">=" 
    threshold: 60.0 
    unit: Percent 
    period: 300 
    evaluation_periods: 1 
    description: Triggered when Disk utilization is more than 60% for 5 minutes 
    alarm_actions: ['arn:aws:sns:us-west-2:1234567890:slack'] 
    when: ec2_tag_Name in ['srv1', 'srv2'] 

- name: "Disk > 60% (filesystem /dev/xvda1)" 
    ec2_metric_alarm: 
    state: present 
    name: "{{ ec2_tag_Name }}-Disk" 
    region: "{{ ec2_region }}" 
    dimensions: 
     InstanceId: '{{ ec2_id }}' 
     MountPath: "/" 
     Filesystem: '/dev/xvda1' 
    namespace: "System/Linux" 
    metric: DiskSpaceUtilization 
    statistic: Average 
    comparison: ">=" 
    threshold: 60.0 
    unit: Percent 
    period: 300 
    evaluation_periods: 1 
    description: Triggered when Disk utilization is more than 60% for 5 minutes 
    alarm_actions: ['arn:aws:sns:us-west-2:1234567890:slack'] 
    when: ec2_tag_Name not in ['srv1', 'srv2'] 

Единственное различие между этими двумя задачами является Filesystem размером и when условия (in или not in).

Есть ли способ получить значение Filesystem, поэтому я могу использовать их как можно удобно, скажем, ec2_id? Моя самая большая проблема заключается в том, что я должен следить за значениями файловой системы при создании новых машин и обрабатывать списки машин в соответствии с этими значениями.

+0

Я сейчас работаю с этим же с Ansible. Вы когда-нибудь находили решение? – brandonhilkert

+0

Нет, я этого не сделал. Все еще используя версию, указанную в вопросе = ( –

ответ

1

Я не смог найти приятное решение этой проблемы и в итоге написал сценарий bash для создания файла YAML, содержащего переменные UUID.

  1. Запустите скрипт на удаленном компьютере с помощью script module: - script: ../files/get_disk_uuid.sh > /disk_uuid.yml
  2. Fetch созданный файл с удаленного
  3. Используйте include_vars_module импортировать переменные из файла. Синтаксис YAML требует, чтобы дефисы заменялись символами подчеркивания в именах переменных. Диск диска «cloudimg-rootfs» становится «cloudimg_rootfs». Немаркированные диски используют имена переменных: «disk0, disk1, disk2 ...»

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

#! /bin/bash 
# get_disk_uuid.sh 

echo '---' 
disk_num=0 
for entry in `blkid -o export -s LABEL -s UUID`; do 
    if [[ $entry == LABEL* ]]; 
    then 
    label=${entry: 6} 
    elif [[ $entry == UUID* ]]; 
    then 
     uuid=${entry: 5} 
    fi 
    if [ $label ] && [ $uuid ]; then 
     printf $label: | tr - _ 
     printf ' '$uuid'\n' 
     label='' 
     uuid='' 
    elif [ $uuid ]; then 
     printf disk$disk_num: 
     printf ' '$uuid'\n' 
     label='' 
     uuid='' 
fi 
done