【问题标题】:How to exclude a word with regex in ansible playbook?如何在ansible playbook中使用正则表达式排除单词?
【发布时间】:2022-01-11 20:07:36
【问题描述】:

我正在尝试开发一个 Ansible playbook 来选择和显示 vCenter 中的数据存储列表,但是出于验证目的,我不应该选择名称中包含 localLocal 的数据存储。

例如考虑以下 4 个数据存储:

  • datastore:local8
  • TQAESXHOST05-Local01
  • vnx_dwcesxbl_ecom_lun7
  • tqaesx37d_1

它应该只选择:

  • vnx_dwcesxbl_ecom_lun7
  • tqaesx37d_1

应该选择:

  • datastore:local8
  • TQAESXHOST05-Local01

这是剧本

tasks:
- name: List of datastores with calculated values
  set_fact:
    ds_size_list: "{{ ds_size_list | default([]) + [{ 'name' : item.name, 'capacity' : item.capacity, 'freeSpace' : item.freeSpace, 'freeSpaceAfter' : freeSpaceAfter | int, 'percentFreeAfter' : percentFreeAfter | int }] }}"
  with_items: "{{ datastore_info.datastores }}"
  vars:
    freeSpaceAfter: "{{ item.freeSpace - (vm_size_b | int) }}"
    percentFreeAfter: "{{ freeSpaceAfter | int / item.capacity * 100 }}"
  when: item.accessible
  when: when: item.name is regex(?!local) #should exclude datastores containing "local" word

需要有关编写正则表达式以排除包含单词local 的数据存储的建议。

【问题讨论】:

    标签: python regex automation ansible vmware


    【解决方案1】:

    为此使用正则表达式可能有点过头了。您可以使用 Jinja 的 in 测试来断言子字符串包含在字符串中——因为字符串只是一个字符序列,in 测试适用于字符串。

    所以,给定:

    - debug:
        msg: "{{ item.name }}"
      loop: "{{ datastore_info.datastores }}"
      when: 
        - item.accessible
        - "'Local' not in item.name"
        - "'local' not in item.name"
      loop_control:
        label: "{{ item.name }}"
      vars:
        datastore_info:
          datastores:
            - name: datastore:local8
              accessible: yes
            - name: TQAESXHOST05-Local01
              accessible: yes
            - name: vnx_dwcesxbl_ecom_lun7
              accessible: yes
            - name: tqaesx37d_1
              accessible: yes
    

    这个产量:

    TASK [debug] ****************************************************************************
    skipping: [localhost] => (item=datastore:local8) 
    skipping: [localhost] => (item=TQAESXHOST05-Local01) 
    ok: [localhost] => (item=vnx_dwcesxbl_ecom_lun7) => 
      msg: vnx_dwcesxbl_ecom_lun7
    ok: [localhost] => (item=tqaesx37d_1) => 
      msg: tqaesx37d_1
    

    如果您根本不关心 local 的大小写(LocallOcAl、...),您甚至可以使用 lower filter 进一步简化它并执行以下操作:

    when: 
      - item.accessible
      - "'local' not in item.name | lower"
    

    【讨论】:

      【解决方案2】:

      问:排除包含单词‘local’或‘Local’的数据存储。

      A:Reject the items where the attributename 可以search Python 正则表达式'[lL]ocal'。例如,给定下面的数据进行测试

          datastores:
            - {name: datastore:local8, capacity: 100, freeSpace: 10}
            - {name: TQAESXHOST05-Local01, capacity: 200, freeSpace: 20}
            - {name: vnx_dwcesxbl_ecom_lun7, capacity: 300, freeSpace: 30}
            - {name: tqaesx37d_1, capacity: 400, freeSpace: 40}
      

      任务

          - set_fact:
              ds_size_list: "{{ ds_size_list|default([]) +
                                [{'name': item.name,
                                  'capacity': item.capacity,
                                  'freeSpace' : item.freeSpace,
                                  'percentFreeAfter': percentFreeAfter|int }] }}"
            loop: "{{ datastores|rejectattr('name', 'search', '[lL]ocal') }}"
            vars:
              percentFreeAfter: "{{ item.freeSpace|int / item.capacity|int * 100 }}"
      

      给予

        ds_size_list:
        - capacity: 300
          freeSpace: 30
          name: vnx_dwcesxbl_ecom_lun7
          percentFreeAfter: 10
        - capacity: 400
          freeSpace: 40
          name: tqaesx37d_1
          percentFreeAfter: 10
      

      如果你想保留物品的所有属性你可以combine附加属性。这简化了代码。例如,下面的任务给出了相同的结果

          - set_fact:
              ds_size_list: "{{ ds_size_list|default([]) +
                                [item|combine({'percentFreeAfter': percentFreeAfter|int})] }}"
            loop: "{{ datastores|rejectattr('name', 'search', '[lL]ocal') }}"
            vars:
              percentFreeAfter: "{{ item.freeSpace|int / item.capacity|int * 100 }}"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-09
        • 2019-04-30
        • 1970-01-01
        • 2013-02-28
        • 1970-01-01
        • 2021-04-20
        • 2017-03-13
        相关资源
        最近更新 更多