背景:
当一个服务有多块磁盘的时候,我们需要对系统上磁盘进行分区,可是格式化。如果磁盘多,服务器多操作起来非常麻烦 。
下面这个列子就是获取机器上所有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 不是我想要的磁盘。
网友评论