amazon-web-services - 当分区名称变化时,用 ansible 分配最大分区
问题描述
我正在使用 ansible 来配置一些 AWS 服务器。所有服务器都有一个 1024 GB 或更大的分区。我想分配这个分区并将其分配给/data
.
我有一个可以在我的测试机器上执行此操作的 ansible 脚本。但是,当我尝试在我的所有 AWS 机器上运行它时,它在某些机器上失败了,抱怨/dev/nvme1n1
设备不存在。问题是有些服务器有一个 20 GB 的根分区与较大的分区分开,而有些则没有。这意味着有时我关心的分区是nvme1n1
,有时是nvm0n1
.
我不想在主机文件中放置变量,因为无论如何该文件都是从 AWS 动态加载的。鉴于查找最大设备并在 ansible 中获取其名称的最简单方法是什么,以便我可以正确告诉 ansible 分配最大的设备?
解决方案
我假设,当您谈论“分区”时,您的意思是“磁盘”,因为分区的名称类似于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
返回第一行(包含最大磁盘的名称)
推荐阅读
- pdf - 为什么 Itext7 .NET 中的 SetFixedPosition() 的纵坐标在 Web 应用程序中不能正常工作?
- variables - 访问嵌套字典的值
- python - 自行划分数字列表
- javascript - 循环中异步等待后节点脚本不会停止
- windows - 无法再从 Windows 资源管理器访问 WSL2 文件或从 WSL2 启动 Windows 程序
- mysql - 如何删除字符串以及它之后的内容?
- svg - 应用过滤器之前的抗锯齿 SVG 文本?
- javascript - javascript - 将字符串转换为 json 数组
- angular - 为什么不能通过 --code-coverage 标志调试角度测试
- scala - 在scala中检测类的相互依赖的定义