Улучшайте свои навыки работы с Ansible с помощью передовых методов регулярных выражений для манипулирования строками и извлечения данных, а также regex_search, regex_findall and regex_replace Filters!

Регулярное выражение

Регулярное выражение (regex) — это шаблон символов, описывающий набор строк. Это мощный инструмент для поиска, проверки и обработки текстовых данных. Регулярные выражения широко используются в языках программирования, текстовых редакторах и других программных средствах, работающих с текстовыми данными.

Регулярное выражение состоит из последовательности символов, определяющих соответствующий шаблон. Эти символы могут включать буквы, цифры, специальные символы и метасимволы. Метасимволы — это специальные символы, которые имеют особое значение в регулярных выражениях, например . (совпадение с любым символом), * (совпадение с нулем или более вхождений) и + (отметка одного или нескольких вхождений).

Регулярные выражения можно использовать для различных задач, например:

  • Поиск определенных шаблонов в текстовых данных
  • Проверка входных данных, чтобы убедиться, что они соответствуют определенному формату
  • Извлечение определенных данных из текста
  • Замена части текста другим текстом
  • Разделение текста на области на основе разделителя или шаблона

Например, регулярное выражение ^[a-z]+@[a-z]+\.[a-z]{2,3}$ соответствует адресам электронной почты, состоящим из одной или нескольких строчных букв перед символом @, одной или нескольких строчных букв после символа @ и перед ., а также домена верхнего уровня из двух или трех букв нижнего регистра. после ..

Регулярные выражения могут быть сложными и требуют тщательной обработки для достижения желаемых результатов. Доступно множество онлайн-ресурсов и руководств, которые помогут изучить регулярные выражения и попрактиковаться в их использовании.

Модули регулярных выражений Ansible

В Ansible фильтр regex_search представляет собой фильтр Jinja2, который позволяет вам искать шаблон регулярного выражения в строке и извлекать соответствующую подстроку. Под ним используйте модуль Python re.

Синтаксис фильтра regex_search:

{{ my_string | regex_search(regex_pattern) }}

Здесь my_string — это строка для поиска, а regex_pattern — это шаблон регулярного выражения для поиска.

Если поиск успешен, regex_search возвращает первую совпадающую подстроку. Если совпадений несколько, возвращается только первое совпадение. Если совпадения нет, возвращается пустая строка.

Фильтр regex_search принимает два аргумента: шаблон регулярного выражения для поиска и строку для поиска. Вот пример:

- name: Search for pattern in string
  ansible.builtin.debug:
    msg: "{{ my_string | regex_search('pattern') }}"

В этом примере my_string — это переменная, содержащая строку для поиска, а 'pattern' — это шаблон регулярного выражения для поиска. Фильтр regex_search будет искать первое вхождение 'pattern' в пределах my_string и возвращать его как результат задачи debug.

Например, предположим, что у вас есть переменная my_string, содержащая текст «Мой номер телефона 123-456-7890». Вы можете использовать фильтр regex_search, чтобы извлечь номер телефона из строки, используя шаблон регулярного выражения \d{3}-\d{3}-\d{4}:

{{ my_string | regex_search('\d{3}-\d{3}-\d{4}') }}

Это вернет строку "123-456-7890".

Обратите внимание, что фильтр regex_search использует синтаксис регулярных выражений Python, аналогичный синтаксису, используемому другими языками, такими как Perl и JavaScript. Если вам нужно использовать другой синтаксис, вы можете вместо этого использовать фильтр regex_replace, который позволяет указать синтаксис регулярного выражения.

regex_findall — это фильтр в Ansible, который используется для поиска всех вхождений шаблона регулярного выражения в строке и возврата их в виде списка. Он использует внутреннюю функцию Python re.findall() для поиска всех совпадений с шаблоном в строке и возвращает их в виде списка.

Фильтр regex_findall принимает два аргумента: шаблон регулярного выражения для поиска и строку для поиска. Вот пример:

- name: Find all occurrences of pattern in string
  ansible.builtin.debug:
    msg: "{{ my_string | regex_findall('pattern') }}"

В этом примере my_string — это переменная, содержащая строку для поиска, а 'pattern' — это шаблон регулярного выражения для поиска. Фильтр regex_findall выполнит поиск всех вхождений 'pattern' в пределах my_string и вернет их в виде списка строк в результате выполнения задачи debug.

regex_replace — это фильтр в Ansible, который используется для поиска шаблона регулярного выражения в строке и замены всех совпадений указанной строкой замены. Он использует внутреннюю функцию Python re.sub() для замены всех совпадений шаблона в строке.

Фильтр regex_replace принимает три аргумента: шаблон регулярного выражения для поиска, строку замены для каждого совпадения и строку для поиска. Вот пример:

- name: Replace all occurrences of pattern in string
  ansible.builtin.debug:
    msg: "{{ my_string | regex_replace('pattern', 'replacement') }}"

В этом примере my_string — это переменная, содержащая строку для поиска, 'pattern' — это шаблон регулярного выражения для поиска, а 'replacement' — это строка замены, используемая для каждого совпадения. Фильтр regex_replace будет искать все вхождения 'pattern' в пределах my_string и заменять их на 'replacement', возвращая результирующую строку в качестве сообщения для задачи debug.

Ссылки

Демо

Этот плейбук Ansible делает следующее:

  1. Отправляет запрос GET на URL-адрес centos_repo и регистрирует содержимое ответа в переменной available_packages.
  2. Использует модуль set_fact для извлечения последней версии ядра из содержимого available_packages, применяя два фильтра регулярных выражений: regex.replace('<.*?>') удаляет все теги HTML из содержимого, а regex_findall('kernel-[0-9].*rpm') ищет все имена пакетов ядра, которые начинаются с «kernel-» и заканчиваются на «.rpm». '.
  3. Выводит переменную kernel на консоль с помощью модуля debug.

В целом, этот плейбук является примером использования фильтров регулярных выражений в Ansible для извлечения конкретных данных из строки, в данном случае последнего имени пакета ядра из списка доступных пакетов.

код

  • регулярное выражение.yml
---
- name: regex demo
  hosts: all
  vars:
    centos_repo: http://mirror.centos.org/centos/7/os/x86_64/Packages/
  tasks:
    - name: Get Latest Kernel
      ansible.builtin.uri:
        url: "{{ centos_repo }}"
        method: GET
        return_content: true
        body_format: json
      register: available_packages

    - name: Save
      ansible.builtin.set_fact:
        kernel: "{{ available_packages.content | ansible.builtin.regex_replace('<.*?>') | regex_findall('kernel-[0-9].*rpm') }}"

    - name: Print
      ansible.builtin.debug:
        var: kernel
  • инвентарь
localhost ansible_connection=local

исполнение

ansible-playbook -i inventory regex.yml

PLAY [regex demo] *********************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************
[WARNING]: Platform darwin on host localhost is using the discovered Python interpreter at /opt/homebrew/bin/python3.11, but future installation
of another Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible-
core/2.14/reference_appendices/interpreter_discovery.html for more information.
ok: [localhost]

TASK [Get Latest Kernel] **************************************************************************************************************************
ok: [localhost]

TASK [Save] ***************************************************************************************************************************************
ok: [localhost]

TASK [Print] **************************************************************************************************************************************
ok: [localhost] => {
    "kernel": [
        "kernel-3.10.0-1160.el7.x86_64.rpm"
    ]
}

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

идемпотентность

ansible-playbook -i inventory regex.yml

PLAY [regex demo] *********************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************
[WARNING]: Platform darwin on host localhost is using the discovered Python interpreter at /opt/homebrew/bin/python3.11, but future installation
of another Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible-
core/2.14/reference_appendices/interpreter_discovery.html for more information.
ok: [localhost]

TASK [Get Latest Kernel] **************************************************************************************************************************
ok: [localhost]

TASK [Save] ***************************************************************************************************************************************
ok: [localhost]

TASK [Print] **************************************************************************************************************************************
ok: [localhost] => {
    "kernel": [
        "kernel-3.10.0-1160.el7.x86_64.rpm"
    ]
}

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

Резюме

В этом учебнике Ansible показано, как автоматизировать управление пакетами, извлекая последнюю версию пакета ядра из списка доступных пакетов с помощью фильтров регулярных выражений. Playbook использует модуль uri для отправки запроса GET в репозиторий CentOS и регистрирует содержимое ответа в переменной. Затем он применяет два фильтра регулярных выражений, используя модуль set_fact, чтобы извлечь имя последнего пакета ядра из содержимого и сохранить его в переменной. Наконец, playbook использует модуль debug для вывода переменной kernel на консоль. В этом пособии демонстрируются передовые методы регулярных выражений для манипулирования строками и извлечения данных, которые можно применять к различным вариантам использования в Ansible.

Надеюсь, вам понравилось это читать. Если вы хотите поддержать меня как писателя, рассмотрите возможность подписки стать участником Medium. Всего 5 долларов в месяц, и вы получаете неограниченный доступ к Medium.

Подпишитесь на канал YouTube, Medium, Substack и веб-сайт, чтобы не пропустить следующий выпуск Ansible Pilot.

Лучшие ресурсы для Ansible

Видеокурс

Печатная книга

электронные книги

Пожертвовать