簡體   English   中英

Map function 超過 ansible jinja 模板中 dict 的值

[英]Map function over values of dict in ansible jinja template

我想將字典的值轉換為字符串並將它們小寫,然后 map 在字典上用=加入每個項目對,然后用,加入項目。

示例輸入:

{"A": "Aardvark", "B": "Beaver", "C": "Cat"}

所需的 output:

A=aardvark,B=beaver,C=cat

我實際上並不關心 A、B、C 到達的順序,但我想確保我的鍵和值最終不會混淆,即沒有A=cat或其他任何東西。

我現在正在做的是這樣的:

{{ foo.keys() | zip(foo.values() | map("lower")) | map("join", "=") | join(",") }}

到目前為止,它適用於我提供的測試數據。 但是,我不確定這是否保證正確,我也不認為這是解決此問題的最有效或最優雅的方法。 有沒有更好的方法來 map lower字典中的值的 function ?

我嘗試使用dict2items並在map function 上指定一個attribute ,但是當我這樣做時,我收到一個關於意外關鍵字 arg 的錯誤,而且它真的很難看:

{{ (foo | dict2items | map("lower", attribute="value") | list | items2dict).items() | map("join", "=") | join(",") }}

注意:我現在在 Python 3.5 上使用 Ansible 2.9,但我真的很想要一個不管 Python 版本如何都可以工作的解決方案。

您可以使用自定義過濾器:

您在 playbook 文件夾中創建一個文件夾filter_plugins (我已將文件命名為myfilters.py和過濾器cstring

文件夾 filter_plugins 中的 myfilters.py:

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

    def cstring(self, data):
        result = ""
        for k in data:
            result += (',' if result else '') + k + '=' + data[k].lower()

        return result

紙書:

- name: "tips1"
  hosts: localhost
  vars:
    foo: {"A": "Aardvark", "B": "Beaver", "C": "Cat"}
  tasks:
    - name: debug users      
      set_fact:
        result: "{{ foo | cstring }}"

    - name: display result     
      debug:
        var: result 

結果:

ok: [localhost] => {
    "result": "A=aardvark,B=beaver,C=cat"
}

使用自定義過濾器的優點是只需一個操作即可完成復雜的事情或很多事情

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM