如何从Ansible事实获取已卸载的设备

时间:2018-12-10 05:53:03

标签: linux ansible

我想通过Ansible剧本实现这样的要求 1.获取Ansible主机事实 2.使用ansible_device运行“ ansible_mounts.device” 3.如果任何设备不在ansible.mounts.device中,则将它们打印到文件中。

下面是我的剧本:

- hosts: all
  become: true
  tasks:
  - name: list all mounted device
    shell: /bin/echo {{ item.device }} >> /root/mounted
    with_items: "{{ ansible_mounts }}"
    register: mounted_device
  - name: list all umount disks
    shell: /bin/echo {{ item }}
    with_items: "{{ ansible_devices.keys() }}"
    when: '{{ item }} not in {{ mounted_device }} '

但是,mounted_device始终是ansible_mounts元素中所有信息的列表,我认为它应该是诸如“ / dev / xvda1”之类的设备列表。实际上,在/ root / mount中,它“ / dev / xvda1”

有人可以帮忙吗?还是有其他更出色的方法来实现目标?

1 个答案:

答案 0 :(得分:0)

虽然您可以使用所采用的方法来使某事起作用,但我不建议这样做,因为它既复杂又脆弱。

AWS提供了一个特殊的API端点,它将公开有关您正在运行的实例的信息。可从http://169.254.169.254访问此端点(从您正在运行的实例)。

有关块设备的信息位于http://169.254.169.254/latest/meta-data/block-device-mapping/,它将为您提供块设备的列表。主块设备被命名为“ ami”,然后任何后续的EBS卷都被命名为“ ebs2”,“ ebs3”,...,“ ebsn”。然后,您可以访问http://169.254.169.254/latest/meta-data/block-device-mapping/ebs2,它将仅返回映射到该块设备的OS设备名称(即“ sdb”)。

获取此信息,下面是一些示例代码,用于访问第一个附加EBS卷的数据:

- name: Set EBS name to query
  set_fact:
    ebs_volume: ebs2
- name: Get device mapping data
  uri:
    url: "http://169.254.169.254/latest/meta-data/block-device-mapping/{{ ebs_volume }}"
    return_content: yes
  register: ebs_volume_data
- name: Display returned data
  debug:
    msg: "{{ ebs_volume_data.content }}"