ansible获取集群上的未分区的磁盘

2019-05-23  本文已影响0人  迷茫_小青年

背景:
当一个服务有多块磁盘的时候,我们需要对系统上磁盘进行分区,可是格式化。如果磁盘多,服务器多操作起来非常麻烦 。

下面这个列子就是获取机器上所有sd*的磁盘并进行分区。
(注意:这里有一个bug是,如果机器上有没有分区,直接格式化磁盘一定不要用了。解释下:“正常的一块磁盘比如/dev/sdd。要先分区,删除一个额外的块设备/de/sdd1。然后对这个sdd1进行mkfs。有的人偷懒。直接对/dev/sdd进行mkfs。然后挂载就会变成/dev/sdd 没有分区编号” 再执行这个task就会对这个磁盘重新进行分区。后果就是原来的磁盘的数据都丢了 )

---

- hosts: hadoop

  tasks:
    - name: 获取磁盘分区
      parted:
        device: "/dev/{{ item.key }}"
        number: 1
        state: present
      when: item.key | regex_search('sd[b-w]$')
      with_dict: "{{ ansible_device_links.ids }}"

逐步分析:
with_dict: "{{ ansible_device_links.ids }}"
这步就是通过fact获取机器上的磁盘信息。
元数据大概是这样的

"ansible_device_links": {
            "ids": {
                "sda": [
                    "usb-Generic-_SD_MMC_CRW_29203008282014000-0:0"
                ],
                "sdb": [
                    "scsi-35000c500b81bcbfb",
                    "wwn-0x5000c500b81bcbfb"
                ],
                "sdx1": [
                    "scsi-3600508b1001c4453a2619115558dfd36-part1",
                    "wwn-0x600508b1001c4453a2619115558dfd36-part1"
                ],
                "sdx2": [
                    "scsi-3600508b1001c4453a2619115558dfd36-part2",
                    "wwn-0x600508b1001c4453a2619115558dfd36-part2"
                ],
                "sdx3": [
                    "scsi-3600508b1001c4453a2619115558dfd36-part3",
                    "wwn-0x600508b1001c4453a2619115558dfd36-part3"
                ]
            },
            "labels": {},
            "masters": {},
            "uuids": {
                "sdb1": [
                    "1067e310-5304-4cf0-92ec-9b20179f4c79"
                ],
                "sdc1": [
                    "02ae9984-e69f-4349-88fd-8372a6eee0d4"
                ],
                "sdd1": [
                    "bc73f7e5-6ceb-42e3-ba7c-6553ac6cd5e8"
                ],
                "sde1": [
                    "5912aa5e-0d77-4a35-a1a5-eb9af2d3877b"
                ],
                "sdx1": [
                    "6546-7FE7"
                ],
                "sdx2": [
                    "17fabefd-0b1f-4f05-bbb4-a6f20edf5c2c"
                ],
                "sdx3": [
                    "e83ac11d-d662-4bf1-84c3-a93fb229bb2c"
                ]
            }
         }

通过ansible_device_links.ids 这个变量能直接获取到磁盘相关的字典表。然后实用with_dict 直接循环ansible_device_links.ids 字典变量。得到类似这样的数据格式

(item={'value': [u'scsi-35000c500b81bfb43', u'wwn-0x5000c500b81bfb43'], 'key': u'sdk'})
(item={'value': [u'scsi-3600508b1001c93a12a34f685a294bfe3-part3', u'wwn-0x600508b1001c93a12a34f685a294bfe3-part3'], 'key': u'sdx3'})

我们只要获取key即可得到想要的磁盘编号信息。

但是key会有已经分区过的磁盘编号,比如第二条sdx3 类似这种。

when: item.key | regex_search('sd[b-w]$')

对item.key 进行过滤。后面的表达式为真的继续执行。
表达式的意思sd两个字母后面是b到w结尾。
因为我已经已知sda 和sdx 不是我想要的磁盘。

上一篇下一篇

猜你喜欢

热点阅读