如何使用jinja2过滤器来擦除ansible playbook中的dict值

时间:2016-02-17 18:23:43

标签: python dictionary filter ansible jinja2

我有一个playbook任务,它返回一个像这样的词典列表:

mydict:
  - { "ip": "192.168.0.1", "mac": "00324a:ac6789" }
  - { "ip": "192.168.0.2", "mac": "00324a.ac6790" }
  - { "ip": "192.168.0.3", "mac": "00:32:4a:ac:67:91" }

我想清理mac地址,以便它们以相同的格式出现,例如:

- set_fact:
    myarp: "{{ mydict|map(attribute='mac')|ipaddr('eui48')  }}"

将返回:

myarp:
  - { "ip": "192.168.0.1", "mac": "00-32-4A-AC-67-89" }
  - { "ip": "192.168.0.2", "mac": "00-32-4A-AC-67-90" }
  - { "ip": "192.168.0.3", "mac": "00-32-4A-AC-67-91" }

1 个答案:

答案 0 :(得分:0)

它不能使用map,因为此过滤器只返回一个特定属性或将另一个过滤器应用于列表的每个元素。但是您不能将过滤器应用于每个列表元素的特定属性。我不认为使用内置过滤器可以做到这一点,如果有的话,它就太难以理解了。

您可以做的最好的事情是write a custom filter plugin

from ansible import errors
from jinja2.filters import environmentfilter
import re

class FilterModule(object):
    def filters(self):
        return {
            'scrubmac': self.scrubmac
        }
    def scrubmac(*args):
        data = args[1]
        for item in data:
            mac = re.sub('[^A-z0-9]', '', item['mac'])
            item['mac'] = re.sub('(.{2})(?=.)', '\\1-', mac)
        return data

Ansible 2的内容。不确定,Ansible 1可能需要稍作修改。

然后将其称为

- set_fact:
    myarp: "{{ mydict | scrubmac }}"