首页 > 解决方案 > 当分区名称变化时,用 ansible 分配最大分区

问题描述

我正在使用 ansible 来配置一些 AWS 服务器。所有服务器都有一个 1024 GB 或更大的分区。我想分配这个分区并将其分配给/data.

我有一个可以在我的测试机器上执行此操作的 ansible 脚本。但是,当我尝试在我的所有 AWS 机器上运行它时,它在某些机器上失败了,抱怨/dev/nvme1n1设备不存在。问题是有些服务器有一个 20 GB 的根分区与较大的分区分开,而有些则没有。这意味着有时我关心的分区是nvme1n1,有时是nvm0n1.

我不想在主机文件中放置变量,因为无论如何该文件都是从 AWS 动态加载的。鉴于查找最大设备并在 ansible 中获取其名称的最简单方法是什么,以便我可以正确告诉 ansible 分配最大的设备?

标签: amazon-web-servicesansible

解决方案


我假设,当您谈论“分区”时,您的意思是“磁盘”,因为分区的名称类似于nvme0n1p1,而磁盘则称为nvme0n1

也就是说,我还没有找到一种“ansible-way”来做到这一点,所以我通常会解析lsblk并做一些 grep-magic。在您的情况下,这是您需要运行的:

- name: find largest disk
  shell: |
    set -euo pipefail
    lsblk -bl -o SIZE,NAME | grep -P 'nvme\dn\d$' | sort -nr | awk '{print $2}' | head -n1
  args:
    executable: /bin/bash
  register: largest_disk

- name: print name of largest disk
  debug:
    msg: "{{ largest_disk.stdout }}"

您可以使用parted-module中的磁盘名称来做任何您需要的事情。
除此之外,您应该在格式化磁盘之前添加一些检查,这样您就不会覆盖某些内容(例如,如果您的 playbook 之前在主机上运行,​​则磁盘可能已经格式化并包含数据,在这种情况下,您不会再次格式化,因为您会覆盖现有数据)。

解释:

  • lsblk -bl -o SIZE,NAME打印所有块设备的大小和名称
  • grep -P 'nvme\dn\d$'greps out all disks(分区pXX最后有一些,记得吗?)
  • sort -nr按第一列对输出进行数字排序(这样你就可以得到最大的)
  • awk '{print $2}'仅打印第二列(即名称)
  • head -n1返回第一行(包含最大磁盘的名称)

推荐阅读