Ansible 从循环中拉出块设备 UUID,并用于挂载模块上的变量

问题描述 投票:0回答:2

我正在尝试动态提取我尝试安装的磁盘的 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以修改输入的经验?

ansible jinja2 centos7
2个回答
5
投票

将设备和安装路径放入这样的变量中怎么样:


    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


0
投票

我意识到这个问题实际上是关于循环的,但我认为搜索你想要完成的任务的人可能会喜欢这个答案。

因此,虽然可以使用 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

请注意,这里假设磁盘有分区,但事实并非一定如此。

© www.soinside.com 2019 - 2024. All rights reserved.