Ansible: Реализация алгоритма сопоставления для производителей для потребителей

Итак, сценарий таков, что у меня есть производители и потребители в соотношении 7: 1, и я хочу иметь последовательное и детерминированное многократное отображение ч / б производителей и потребителей в моем сервисе. Список потребителей предоставляется в конфигурации каждому производителю, что делается через ansible. Итак, я пытаюсь реализовать логику отображения в самом ANSIBLE, а не передавать весь список потребителей и делать это внутри службы производителя. Итак, я подумал об использовании пользовательского фильтра для фильтрации из списка потребителей и назначения его производителю. Ниже приведен пользовательский фильтр, который я написал:

#!/usr/bin/python

class FilterModule(object):

    def filters(self):
        return { 'map_producer_to_consumer': self.map_producer_to_consumer }

    # consumer_servers: complete list of consumers servers
    # producer_id: provided to each producer for mapping purpose
    # producer_count: total no. of producers
    # map_consumer_count: no. of consumers need to be mapped to each producer
    # consumer_count: total no. of consumers

    def map_producer_to_consumer(self, consumer_servers, producer_id, producer_count, map_consumer_count):
        consumer_count = len(consumer_servers)
        index_offset = 0 if  producer_count%consumer_count else 1
        rotation_count = (producer_id/consumer_count) % (map_consumer_count-1) # used for left rotation of mapped servers
        map_consumer_indexes = [ (producer_count*i  + producer_id + index_offset*i) % consumer_count for i in xrange(map_consumer_count)]
        mapped_consumer_servers = [consumer_servers[map_consumer_indexes[0]]]
        for i in xrange(1, map_consumer_count):
            index = (i + rotation_count) % map_consumer_count
            if i + rotation_count >= map_consumer_count:
                mapped_consumer_servers.append( consumer_servers[map_consumer_indexes[index] + 1] )
            else:
                mapped_consumer_servers.append( consumer_servers[map_consumer_indexes[index]] )
        return (',').join(mapped_consumer_servers) 

Этот фильтр работает должным образом при использовании со статическими аргументами, подобными этим:

"{{ tsdb_boxes | map_producer_to_consumer(2,3,3) }}"

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

"{{ groups['producers'] | map_producer_to_consumer ({{ consumer_servers }}, {{ producer_id }}, {{ producer_count }}, {{ map_consumer_count }}) }}"

но это приводит к ошибкам из-за вложения переменных, что недопустимо в Jinja2. Если я попробую что-то вроде этого:

"{{ groups['producers'] }} | map_producer_to_consumer ({{ consumer_servers }}, {{ producer_id }}, {{ producer_count }}, {{ map_consumer_count }})"

это приводит к распечатке строки следующим образом:

['ip-1', 'ip-2'...] | map_producer_to_consumer (1000, 10, 150, 3)

Может кто-нибудь подсказать, пожалуйста, какой должен быть лучший способ добиться этого. Должен ли я использовать скрипт-модуль и конвертировать логику в bash, иначе лучше оставить это только внутри сервиса.

1 ответ

Решение

Ответ из комментариев:

Почему бы не попробовать {{ groups['producers'] | map_producer_to_consumer(consumer_servers, producer_id, producer_count, map_consumer_count) }}

И ссылка от @techraf о вложенности.

Другие вопросы по тегам