如何通过AWS EC2动态库存获取文件系统

时间:2016-03-11 14:49:49

标签: amazon-ec2 ansible ansible-inventory

我在使用ec2动态库存通过ansible设置AWS CloudWatch警报时发现了一个特定的问题。

我已成功设置aws-script-mon以监控我的计算机上的磁盘和RAM使用情况。

此外,我还设法使用ansible ec2_metric_alarm模块设置RAM使用率警报。

我目前面临的问题是,在为磁盘使用设置警报时,需要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条件(innot in)。

有什么方法可以获得Filesystem值,这样我可以像使用ec2_id一样舒服地使用它们吗?我最关心的是,我必须在创建新机器时查看文件系统值,并根据该值处理机器列表。

1 个答案:

答案 0 :(得分:1)

我找不到一个很好的解决方案,最终写了一个bash脚本来生成一个包含UUID变量的YAML文件。

  1. 使用script module在远程计算机上运行脚本: - script: ../files/get_disk_uuid.sh > /disk_uuid.yml
  2. Fetch来自远程
  3. 的创建文件
  4. 使用include_vars_module从文件中导入变量。 YAML语法要求将连字符替换为变量名称中的下划线。磁盘标签'cloudimg-rootfs'变为'cloudimg_rootfs'。未标记的磁盘使用变量名称:'disk0,disk1,disk2 ...'
  5. 脚本不理想。有一天,我想写一个完成同样任务的模块。

    #! /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