如何将列表中的 Ansible 注册变量存储到单独的变量中

How to store Ansible registered variables in a list into separate variables

我有一个应该在 EC2 实例中创建 LVM 卷的剧本。 EC2 实例是 class m5ad.8xlarge 实例,因此 EC2 实例附带两个 600GB 的实例存储。

我正在获取 lsblk 的输出以将输出范围缩小到实例存储设备,如下所示:-

    shell: "lsblk | grep -v nvme0 | grep -v NAME | awk '{print }'"
    register: lvm_out

以上给出:-

{
    "lvm_out.stdout_lines": [
        "nvme1n1",
        "nvme2n1"
    ]
}

现在我需要在两个设备上 运行 pvcreate,如下所示:-

pvcreate /dev/nvme1n1 /dev/nvme2n1

我想知道是否可以使用“set_fact”,但不知道如何在这里使用它。

你们能帮忙吗

例如

    - set_fact:
        cmd: "pvcreate {{ lvm_out.stdout_lines|
                          map('regex_replace', _regex, _replace)|
                          join(' ') }}"
      vars:
        _regex: '(^.*$)'
        _replace: '/dev/'

创建字符串

        cmd: pvcreate /dev/nvme1n1 /dev/nvme2n1

您的确切问题应该是:“如何为列表的每个元素添加一个字符串?”

首先,您不需要 运行 shell 来获取磁盘信息。此信息可在名为 ansible_devices 的变量中收集的事实中获得。您将在下面的示例中看到,我可以使用库存 ansible 过滤器获得与您相同的列表。

现在要为字符串列表的每个元素添加一个字符串,您可以使用调用 regex_replace 过滤器的 map 过滤器。将所有内容放在以下剧本中:

---
- hosts: localhost
 
  tasks:
    - debug:
        msg: >-
          {{
            ansible_devices.keys()
            | select('match', 'nvme0')
            | map('regex_replace', '^(.*)$', '/dev/\g<1>')
            | join(' ')
          }}

这给出了(注意:我的电脑上只有一个 nvme 磁盘,你将得到由 space 分隔的 2 个磁盘)

PLAY [localhost] ****************************************************************************************

TASK [Gathering Facts] **********************************************************************************
ok: [localhost]

TASK [debug] ********************************************************************************************
ok: [localhost] => {
    "msg": "/dev/nvme0n1"
}

PLAY RECAP **********************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

更进一步,与上述一样,您不应该使用 shell 来启动 pvcreate 命令,而是 运行 通过 lvg module 来启动命令。