2016-10-05 2 views
0

Я существующий Playbook переменная словаря определяется как:новообращенных ключи словаря в сборнике пьес

vars: 
    resource_tags: { 
    Name: "some name" 
    Service: "some service" 
    } 

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

мне нужно выглядеть следующим образом:

{ 
    "tag:Name": "some name" 
    "tag:Service": "some service" 
    } 

Я попытался итерация с помощью with_dict и установив факт с комбинатом:

- set_fact: 
     ec2_remote_facts_filter: "{{ ec2_remote_facts_filter | default({}) | combine({ 'tag:'item.name: item.val }) }}" 
    with_dict: "{{ ec2_count_resource_tags }}" 

И очевидно, что не работает.

Возможно ли это?

ответ

1

Если вы не возражаете, немного повозка, запряженная волами:

- debug: msg="{{ resource_tags | to_json(indent=0) | regex_replace('\n\"','\n\"tag:') }}" 

Это превратит ваш Dict в JSON-отформатированную строку с indent=0, то есть каждый ключ будет начинаться с новой строки; затем вставьте tag: после первой двойной кавычки в каждой строке.
Поскольку результат справедлив JSON, анзибль шаблон двигатель преобразует его обратно в Словаре в качестве последнего шага подстановки переменных, давая вам:

ok: [localhost] => { 
    "msg": { 
     "tag:Name": "some name", 
     "tag:Service": "some service" 
    } 
} 

Я предполагаю, что могут быть некоторые частные случаи, если есть новые строки внутри вашего но в целом это должно быть хорошо.

+0

Это работает отлично. Я предпочитаю этот подход, потому что он не требует установки каких-либо пользовательских модулей на незаменимом сервере, поэтому код будет работать в моей виртуальной тестовой VM, а также при работе под Ansible Tower. –

1

Возможно, вам нужен пользовательский плагин для поиска в вашем случае.

1) Редактирование файла ansible.cfg и раскомментируйте ключ 'lookup_plugins' со значением './plugins/lookup'

2) Создайте файл плагина под названием 'ec2remote.py' в './plugins/lookup'

3) Используйте его в сборник пьес:

- debug: 
    msg: "{{ item }}" 
    with_ec2remote: "{{ ec2_count_resource_tags }}" 

4) Реализует ваш ec2remote.py (много примеров here)

class LookupModule(LookupBase): 
    def run(self, terms, **kwargs): 
    result = {} 
    for k,v in terms.items(): 
     result["tag:"+k] = v 
    return result 

Обычно я предпочитаю разрабатывать плагины, которые легко использовать и тестировать, и, таким образом, сохранять понятную пьесу.

Смежные вопросы