Рубрики
Uncategorized

Создание пользовательских ассибильных фильтров

Зачастую при написании Anisible PlayBooks, вы можете найти себя, нуждающимся, чтобы выполнить некоторые текстовые преобразования … Теги с DEVOPS, Anisible, Teaileearned, учебником.

Зачастую при написании Anisible Playbooks, вы можете найти себя, нуждающимся, чтобы выполнить некоторые текстовые преобразования. При простых вещах, таких как прямая преобразование типа данных или выполнение алгоритма против строки, это обычно можно легко выполнять Встроенные фильтры Jinja2 в Anbible Отказ

# For human readable output, you can use:
as_json: "{{ some_variable | to_nice_json }}"
as_yaml: "{{ some_variable | to_nice_yaml }}"

# Get the min and max of lists
min_num: "{{ [3, 4, 2] | min }}"
max_num: "{{ [3, 4, 2] | max }}"

# Perform complex operations on strings
sha1_hash: "{{ 'test1' | hash('sha1') }}"
checksum: "{{ 'test1' | checksum }}"

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

Создание пользовательского фильтра

Возьмите этот пример для хорошего кандидата на пользовательский непрерывный фильтр. У нас есть ведро S3 с каждой папкой верхнего уровня, представляющая пакет. Мы хотим создать PlayBook для аудита ведра и находить каждую папку верхнего уровня, присутствующей в ведре.

Однако, если мы должны были выполнить список в ведре S3, мы получим следующий вывод.

- folder1/file1.js
- folder1/sub-folder/file1.js
- folder2/
- folder3/file1.js
- folder3/file2.js
- folder3/file3.js

Этот список показывает ключ каждого объекта в ведре как концепция Папки эмулируются с помощью пути ключей . Теперь, чтобы получить каждую папку верхнего уровня в ведре, мы можем просто получить первую папку на пути и отфильтровать эти папки там уникальными элементами. И надеюсь получить что-то вроде ниже:

folder1
folder2
folder3

Чтобы создать новый модуль фильтра, просто создайте .py Файл в каталоге с именем filter_plugins. (Вы можете назвать этот файл что-нибудь, все .py Файлы автоматически подбираются из filter_plugins Папка), которая находится рядом с нашей PlayBook в дереве файлов. Мы создадим модуль Python, который определяет FilterModule класс. Этот класс должен иметь метод под названием Фильтры Это возвращает карту имен и вызываемые реализации для фильтра.

Чтобы создать пользовательский фильтр, чтобы собрать уникальные корневые папки нашего ведра, мы могли бы написать что-то вроде:

#!/usr/bin/python
class FilterModule(object):
    def filters(self):
        return {'unique_folders': self.unique_base_paths}

    def unique_base_paths(self, keys):
        # A Set allows for no duplication of keys
        base_paths = set()
        for key in keys:
            # A path contains a directory if it has a "/"
            if "/" in key:
                # Get the first folder in each path
                base_folder = key.split("/")[0]
                base_paths.add(base_folder)

        # Sets aren't handled by ansible so convert to list
        return list(base_paths)

Наши пользовательские неблагоприятные функции теперь могут быть вызваны в наших плейговых устройствах, позвонив на наш фильтр с именем Unique_folders Как и любой другой фильтр.

- hosts: localhost

  vars:
    deployment_bucket:
      name: "some-bucket-with-packages"
      region: ap-southeast-2

  tasks:
    - name: List keys
      aws_s3:
        bucket: "{{ deployment_bucket.name }}"
        region: "{{ deployment_bucket.region }}"
        mode: list
      register: bucket_content

    - name: All bucket paths
      debug:
        var: bucket_content.s3_keys

    - name: Get all top level folders in bucket
      set_fact:
        deployed_packages: "{{ bucket_content | unique_folders }}"

    - name: Unique top level folders
      debug:
        var: deployed_packages

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

TASK [Unique top level folders] *********************
ok: [localhost] => {
    "deployed_packages": [
        "folder1",
        "folder2",
        "folder3"
    ]
}

Последние мысли

Пользовательские фильтры — это мощный инструмент для перемещения некоторых из ваших сложных текстовых преобразований для более читаемого кода Python, а не альтернативой длительной цепочке встроенных аномальных фильтров. Эти фильтры, поскольку они являются только в том, что они просто Code Python, повторно используются через проекты, позволяющие вам создавать полезные фильтры для проверки ваших пользовательских типов данных и структур.

дальнейшее чтение

Этот пост был размещен в моем блоге на Код Punnet. . Если вам нравится мое письмо, и хочешь держать в курсе, рассмотрим, подумайте о том, чтобы подписаться на мой Еженедельная рассылка или следовать за RSS Feed Отказ

Обложка Фото Андерс Милльден на Бессмысленно

Оригинал: «https://dev.to/aaronktberry/creating-custom-ansible-filters-29kf»