我正在尝试动态提取我尝试安装的磁盘的 UUID。迄今为止的角色:
---
- name: Get UUID of App disks
shell: blkid {{ UUID_loop }} -s UUID -o value
loop:
- /dev/sdh1
- /dev/sdi1
loop_control:
loop_var: UUID_loop
register: UUID
- set_fact:
UUID_block: "{{ UUID.results | map(attribute='stdout') | join('\n') }}"
- set_fact:
UUID_split: "{{ UUID_block.split(' ')[0:] }}"
- name: Mount App Disks
mount:
path: "{{ item }}"
src: UUID={{ UUID_split }}
fstype: ext4
state: mounted
loop:
- /opt/1
- /opt/2
输出格式如下:
9c64e0f1-5a87-4b71-b9b1-d2c1ffb99471
386316bb-e503-4f54-b9f7-76a9cc1e5878
我需要知道如何让变量获取输出,并将其拆分为可以插入我的
mount
模块循环中的唯一变量。
问题的根源似乎在于同一任务中引用了 2 个循环。我尝试将可变性因素卸载到之前运行的自己的任务中。
例如,我现在为每个块设备填充了 UUID,但它的格式是一个巨大的字符串。示例:
UUID=9c64e0f1-5a87-4b71-b9b1-d2c1ffb99471
386316bb-e503-4f54-b9f7-76a9cc1e5878 /opt/1 ext4 defaults 0 0
UUID=9c64e0f1-5a87-4b71-b9b1-d2c1ffb99471
386316bb-e503-4f54-b9f7-76a9cc1e5878 /opt/2 ext4 defaults 0 0
我需要的最终产品是:
UUID=9c64e0f1-5a87-4b71-b9b1-d2c1ffb99471 /opt/1 ext4 defaults 0 0
UUID=386316bb-e503-4f54-b9f7-76a9cc1e5878 /opt/2 ext4 defaults 0 0
编辑: 感谢您到目前为止的建议,这是我创建的变量的调试输出。
- name: Debug UUID Variable
debug:
msg:
- "{{ UUID_block }}"
输出:
TASK [mst : Debug UUID Variable] ****************************************************************************************************************************
ok: [1.2.3.4] =>
msg:
- |-
9c64e0f1-5a87-4b71-b9b1-d2c1ffb99471
386316bb-e503-4f54-b9f7-76a9cc1e5878
7a07136d-f08c-4d1e-a4af-345683f15f2b
5b3599ac-8e80-420c-90e7-900f8b72f0b8
95216cc8-3db3-4dbb-8e16-500166aafd47
b7c33504-e8b2-4a23-9bd4-658a5a558733
06dca596-fc81-4cd3-a6d0-ab1d45010b67
对于外部脚本示例,是否有从ansible调用、转换数据并转发回ansible以修改输入的经验?
将设备和安装路径放入这样的变量中怎么样:
devices:
- device: /dev/sdh1
mount: /opt/1
- device: /dev/sdi1
mount: /opt/2
然后你可以这样做:
- name: get UUID
ansible.builtin.command: lsblk {{ item.device }} -no UUID
loop: "{{ devices }}"
register: uuid
- name: mount new volumes and create fstab entries
ansible.posix.mount:
path: "{{ item.item.mount }}"
src: UUID={{ item.stdout_lines[0] }}
state: mounted
fstype: xfs
opts: defaults,nofail
loop: "{{ uuid.results }}"
由于 uuid.results 变量包含每个循环的输入变量。 请参阅https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#registering-variables-with-a-loop
我意识到这个问题实际上是关于循环的,但我认为搜索你想要完成的任务的人可能会喜欢这个答案。
因此,虽然可以使用 shell 来获取 UUID,但也可以从 Ansible 事实中更清晰地获取它:
- name: "refresh facts"
setup:
- name: "mount new volumes and create fstab entries"
mount:
path: "{{ item.mount }}"
src: "UUID={{ ansible_facts['devices'][item.device | basename]['partitions'][(item.device + '1') | basename]['uuids'] | first }}"
state: mounted
fstype: xfs
opts: defaults,nofail
loop: "{{ devices }}"
假设变量:
devices:
- device: /dev/sdh
mount: /opt/1
- device: /dev/sdi
mount: /opt/2
请注意,这里假设磁盘有分区,但事实并非一定如此。