美文网首页
ansible获取集群上的未分区的磁盘

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

作者: 迷茫_小青年 | 来源:发表于2019-05-23 18:13 被阅读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 不是我想要的磁盘。

    相关文章

      网友评论

          本文标题:ansible获取集群上的未分区的磁盘

          本文链接:https://www.haomeiwen.com/subject/mtibzqtx.html