Улучшайте свои навыки работы с 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
.
Ссылки
- https://docs.ansible.com/ansible/latest/collections/ansible/builtin/regex_search_filter.html
- https://docs.ansible.com/ansible/latest/collections/ansible/builtin/regex_findall_filter.html
- https://docs.ansible.com/ansible/latest/collections/ansible/builtin/regex_replace_filter.html
Демо
Этот плейбук Ansible делает следующее:
- Отправляет запрос GET на URL-адрес
centos_repo
и регистрирует содержимое ответа в переменнойavailable_packages
. - Использует модуль
set_fact
для извлечения последней версии ядра из содержимогоavailable_packages
, применяя два фильтра регулярных выражений:regex.replace('<.*?>')
удаляет все теги HTML из содержимого, аregex_findall('kernel-[0-9].*rpm')
ищет все имена пакетов ядра, которые начинаются с «kernel-» и заканчиваются на «.rpm». '. - Выводит переменную
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
Видеокурс
Печатная книга
электронные книги
- Ansible на примерах: 200+ примеров автоматизации для системного администратора Linux и Windows и DevOps
- Ansible для Windows на примерах: 50+ примеров автоматизации для системного администратора Windows и DevOps
- Ansible для Linux на примерах: более 100 примеров автоматизации для системного администратора Linux и DevOps
- Файловая система Ansible Linux на примерах: более 40 примеров автоматизации операций с файлами и каталогами Linux для современной ИТ-инфраструктуры
- Ansible для контейнеров и Kubernetes на примерах: более 20 примеров автоматизации контейнеров, Kubernetes и OpenShift
- Ansible For Security на примерах: более 100 примеров автоматизации безопасности и проверки соответствия для современной ИТ-инфраструктуры
- Советы и подсказки Ansible: более 10 примеров Ansible для экономии времени и автоматизации большего количества задач
- Пользователи и группы Ansible Linux на примерах: 20+ примеров автоматизации работы пользователей и групп Linux для современной ИТ-инфраструктуры
- Ansible для PostgreSQL на примерах: более 10 примеров автоматизации вашей базы данных PostgreSQL
- Ansible для Amazon Web Services AWS на примерах: более 10 примеров автоматизации современной инфраструктуры AWS