Ansible извлечь подстроку из совпадающего элемента переменной списка - PullRequest
2 голосов
/ 05 мая 2020

У меня есть переменная, которая представляет собой список , как показано ниже:

"test_list": [
     "some text here",
     "server1",
     "command1 parameter1",
     "path/to/command2 parameter2 server1_202012",
     "some more text",
     "New backup file is server1_202019"
    ]

Я пытаюсь извлечь подстроку server1_202019, которая находится в конце строки, которая начинается с New backup file.... Есть только одна такая строка, и я попробовал вариант ниже, чтобы получить подстроку.

- set_fact: 
    test_name: "{{ test_list | select('^New backup file is (.+)$','\\1') }}" 

, и результат, который я получил:

"test_name": "<generator object _select_or_reject at 0x3fe5b40>" 

Я пробовал ниже код также, но не удалось.

- set_fact: 
    test_name: "{{ test_list | regex_search('^New backup file is (.+)$','\\1') }}" 

Ошибка:

"msg": "Unexpected templating type error occurred on ({{ test_list | regex_search('^New backup file is (.+)$','\\\\1') }}): ..... expected string or buffer"

Может ли кто-нибудь предложить, как я могу получить результат, как показано ниже:

"test_name": "server1_202019"

Версия ansible, которую я использую, - 2.9

Спасибо

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Выберите элемент из списка и введите regex_replace. Например,

    - set_fact:
        test_name: "{{ test_list|
                       select('regex', my_regex)|
                       first|
                       regex_replace(my_regex, my_replace) }}"
      vars:
        my_regex: '^New backup file is (.*)$'
        my_replace: '\1'
    - debug:
        var: test_name

дать

"test_name": "server1_202019"
0 голосов
/ 05 мая 2020

Поскольку test_list - это список, вам нужно oop перебирать элементы, которые нужно сопоставить, с помощью регулярного выражения. Можно сделать что-то вроде ниже.

- set_fact:
    matched: "{{ item | regex_search('^New backup file is (.+)$','\\1') }}"
  loop: "{{ test_list }}"
  register: matching_items

- debug:
    var: item.ansible_facts.matched
  with_items: "{{ matching_items.results }}"
  when: item.ansible_facts.matched != ""

Для отладки должен выводиться как показано ниже:

TASK [debug] *******************************************************************************************************************************
skipping: [localhost] => (item={'changed': False, 'ansible_facts': {'matched': ''}, 'failed': False, 'item': 'some text here', 'ansible_loop_var': 'item'}) 
skipping: [localhost] => (item={'changed': False, 'ansible_facts': {'matched': ''}, 'failed': False, 'item': 'server1', 'ansible_loop_var': 'item'}) 
skipping: [localhost] => (item={'changed': False, 'ansible_facts': {'matched': ''}, 'failed': False, 'item': 'command1 parameter1', 'ansible_loop_var': 'item'}) 
skipping: [localhost] => (item={'changed': False, 'ansible_facts': {'matched': ''}, 'failed': False, 'item': 'path/to/command2 parameter2 server1_202012', 'ansible_loop_var': 'item'}) 
ok: [localhost] => (item={'changed': False, 'ansible_facts': {'matched': ['server1_202019']}, 'failed': False, 'item': 'New backup file is server1_202019', 'ansible_loop_var': 'item'}) => {
    "ansible_loop_var": "item",
    "item": {
        "ansible_facts": {
            "matched": [
                "server1_202019"
            ]
        },
        "ansible_loop_var": "item",
        "changed": false,
        "failed": false,
        "item": "New backup file is server1_202019"
    },
    "item.ansible_facts.matched": [
        "server1_202019"
    ]
}
skipping: [localhost] => (item={'changed': False, 'ansible_facts': {'matched': ''}, 'failed': False, 'item': 'some more text', 'ansible_loop_var': 'item'}) 
...