我想通过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”
有人可以帮忙吗?还是有其他更出色的方法来实现目标?
答案 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 }}"