如何获取真实的 EBS 设备名称以在 Ansible 中进行格式化和安装

cbr*_*ars 6 amazon-ec2 amazon-ebs amazon-web-services ansible

我正在尝试使用 Ansible 构建、附加、格式化 EBS 卷并将其挂载到 EC2 实例。当我构建并附加卷时,名称在实例中不匹配。我怎样才能得到正确的名字?

\n\n

我尝试更改 device_name 以匹配 AWS 设置的内容,但这给了我一个“...不是有效的 EBS 设备名称”。错误。

\n\n

这是我正在尝试的:

\n\n
---\n- name: Get instance ID\n  ec2_metadata_facts:\n- debug:\n    msg: "Adding EBS to {{ ansible_ec2_instance_id }}"\n- name: Create EBS\n  delegate_to: 127.0.0.1\n  run_once: true\n  ec2_vol:\n    instance: "{{ ansible_ec2_instance_id }}"\n    volume_size: \'5\'\n    region: \'us-east-1\'\n    delete_on_termination: yes\n    name: \'wbt_opt_drive\'\n  register: ec2_vol\n- name: Printing the volume information\n  debug: var=ec2_vol\n
Run Code Online (Sandbox Code Playgroud)\n\n

卷信息返回如下:

\n\n
"device": "/dev/sdf"\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我尝试添加文件系统,/dev/sdf 不存在。\n检查实例,这就是我运行 lsblk 得到的结果

\n\n
nvme1n1     259:1    0    8G  0 disk \n\xe2\x94\x94\xe2\x94\x80nvme1n1p1 259:2    0    8G  0 part /\nnvme2n1     259:3    0    5G  0 disk \n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我将任务更改为使用 device_name AWS 默认为:

\n\n
---\n- name: Get instance ID\n  ec2_metadata_facts:\n- debug:\n    msg: "Adding EBS to {{ ansible_ec2_instance_id }}"\n- name: Create EBS\n  delegate_to: 127.0.0.1\n  run_once: true\n  ec2_vol:\n    instance: "{{ ansible_ec2_instance_id }}"\n    volume_size: \'5\'\n    region: \'us-east-1\'\n    delete_on_termination: yes\n    name: \'wbt_opt_drive\'\n    device_name: \'/dev/nvme2n1\'\n  register: ec2_vol\n- name: Printing the volume information\n  debug: var=ec2_vol\n
Run Code Online (Sandbox Code Playgroud)\n\n

我收到此错误:

\n\n
/dev/nvme2n1 is not a valid EBS device name.\n
Run Code Online (Sandbox Code Playgroud)\n\n

从文档中,我了解AWS正在做什么(https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/device_naming.html / https://docs.aws.amazon.com/AWSEC2/latest/UserGuide /nvme-ebs-volumes.html

\n\n

但我想让这种动态适用于我可能想要创建的所有类型的实例。有没有办法从返回的设备挂载点或ID中获取真正的端点?

\n

小智 1

我在https://flowciety.de/en/development-notes-en/ansible-and-aws/上找到了一个很好的解决方案

如果链接断开,我将在这里总结他们的解决方案。

# Per question assume that result of ebs_create is registered to `ec2_vol`

- name: Get Linux device for EBS Volume
  ansible.builtin.shell:
    cmd: "lsblk -o PATH,SERIAL | grep {{ ec2_vol.volume_id | replace('-', '') }} | cut -d ' ' -f 1"
  register: lsblk

- name: Store EBS volume device name
  ansible.builtin.set_fact:
    ebs_volume_device_name: "{{ lsblk.stdout }}"
Run Code Online (Sandbox Code Playgroud)

重要信息:请勿使用此设备名称在系统启动时自动安装设备(例如,在 中/etc/fstab)。根据文档,对于系统启动时附加的 EBS 设备,卷到 NVMe 设备的映射是不确定的。相反,一旦格式化设备,您应该设置并使用标签 LABEL 或提取并使用 UUID,因为无论 NVMe 注册顺序如何,这都不会改变。

Alt:从现有卷中获取名称(来自与上面相同的链接)

- name: Get EC2 volume details
  delegate_to: localhost
  amazon.aws.ec2_vol_info:
    filters:
      "tag:Name": "some-data"  # Assume unique volume name
  register: ec2_vol_info

- name: Get Linux device for EBS Volume
  ansible.builtin.shell:
    cmd: "lsblk -o PATH,SERIAL | grep {{ ec2_vol_info.volumes[0].id | replace('-', '') }} | cut -d ' ' -f 1"
  register: lsblk

# ...
Run Code Online (Sandbox Code Playgroud)