Ansible:如何根据关键字过滤存储在变量中的字符串

时间:2018-10-26 15:48:06

标签: regex ansible yaml jinja2

我正在尝试使用Ansible查找未使用的磁盘。到目前为止,我能够将未使用的磁盘路径保存在变量中。但是我得到了很多其他无用的信息,例如加号和方括号。我想知道如何过滤列表并获取包含/ dev的字符串。 这是我到目前为止的代码:

- set_fact:
    list_of_disks: []

- name: getting list of disks
  set_fact:
    list_of_disks: "[{{list_of_disks}} + '/dev/{{item.key}}']"
  when:
    - not item.value.partitions
    - not item.value.holders
    - not item.value.links.ids
    - item.key | search ("sd")
  with_dict: "{{ ansible_devices }}"

- name: display unused disks
  debug:
    var: list_of_disks.split("'")

这是我得到的输出

    "list_of_disks.split(\"'\")": [
    "[[[] + ",
    "/dev/sde",
    "] + ",
    "/dev/sdc",
    "]"
]

}

我希望输出看起来像 “ / dev / sde”, “ / dev / sdc”,

注意:磁盘名称将从一台服务器更改为另一台服务器。所以我不想只寻找sde和sdc。它应该能够清除列表中出现的所有磁盘。

2 个答案:

答案 0 :(得分:0)

好吧,可能不完全是您想要的格式,但是:

  - debug:
      msg: "{{ item.device }}"
    with_items: "{{ ansible_facts.mounts }}"
    when: "'/dev/' in item.device" 

应该做到这一点。

在本地,我得到了:

TASK [debug] **********************************************************************************************************************************
ok: [localhost] => (item=None) => {
    "msg": "/dev/mapper/fedora-root"
}
ok: [localhost] => (item=None) => {
    "msg": "/dev/nvme0n1p1"
}
ok: [localhost] => (item=None) => {
    "msg": "/dev/mapper/fedora-home"
}

答案 1 :(得分:0)

如果全部需要它们,则创建一个变量并将其附加到该变量上:

  - set_fact:
      list_of_disks=""

  - set_fact: 
      list_of_disks: "{{ list_of_disks | regex_replace('^, ','') }}, {{ item.device }}"
    with_items: "{{ ansible_facts.mounts }}"
    when: "'/dev/' in item.device"

  - debug:
      msg: "{{ list_of_disks }}"

为此,我得到了:

TASK [debug] **********************************************************************************************************************************
ok: [localhost] => {
    "msg": "/dev/mapper/fedora-root, /dev/nvme0n1p1, /dev/mapper/fedora-home"
}