我正在尝试使用 Ansible 构建、附加、格式化 EBS 卷并将其挂载到 EC2 实例。当我构建并附加卷时,名称在实例中不匹配。我怎样才能得到正确的名字?
我尝试更改 device_name 以匹配 AWS 设置的内容,但这给了我一个“...不是有效的 EBS 设备名称”。错误。
这是我正在尝试的:
---
- name: Get instance ID
ec2_metadata_facts:
- debug:
msg: "Adding EBS to {{ ansible_ec2_instance_id }}"
- name: Create EBS
delegate_to: 127.0.0.1
run_once: true
ec2_vol:
instance: "{{ ansible_ec2_instance_id }}"
volume_size: '5'
region: 'us-east-1'
delete_on_termination: yes
name: 'wbt_opt_drive'
register: ec2_vol
- name: Printing the volume information
debug: var=ec2_vol
卷信息返回此:
"device": "/dev/sdf"
如果我尝试添加文件系统,/dev/sdf 不存在。 检查实例,这就是我运行 lsblk 的结果
nvme1n1 259:1 0 8G 0 disk
└─nvme1n1p1 259:2 0 8G 0 part /
nvme2n1 259:3 0 5G 0 disk
如果我将任务更改为使用 device_name AWS 默认为:
---
- name: Get instance ID
ec2_metadata_facts:
- debug:
msg: "Adding EBS to {{ ansible_ec2_instance_id }}"
- name: Create EBS
delegate_to: 127.0.0.1
run_once: true
ec2_vol:
instance: "{{ ansible_ec2_instance_id }}"
volume_size: '5'
region: 'us-east-1'
delete_on_termination: yes
name: 'wbt_opt_drive'
device_name: '/dev/nvme2n1'
register: ec2_vol
- name: Printing the volume information
debug: var=ec2_vol
我收到此错误:
/dev/nvme2n1 is not a valid EBS device name.
从文档中,我了解 AWS 正在做什么(https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/device_naming.html / https://docs.aws.amazon.com/AWSEC2 /latest/UserGuide/nvme-ebs-volumes.html)
但我想让这种动态适用于我可能想要创建的所有类型的实例。有没有办法从返回的设备挂载点或ID中获取真实的端点?
我在 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 }}"
重要:请勿使用此设备名称在系统启动时自动安装设备(例如在
/etc/fstab
中)。根据“文档”,卷到 NVMe 设备的映射对于系统启动时附加的 EBS 设备来说是不确定的。相反,一旦格式化设备,您应该设置并使用标签 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
# ...