簡體   English   中英

使用列表內容創建字典,並使用 Ansible 使用 Jinja2 計數

[英]Create dictionary with content of a list and it's count with Ansible using Jinja2

我有一個如下列表:

str_lst:
  - "someline    user1     OK     somedata    somecommand"
  - "someline    user1     OK     somedata    somecommand"
  - "someline    user1     OK     somedata    somecommand"
  - "someline    user2     OK     somedata    somecommand"
  - "someline    user2     OK     somedata    somecommand"

我必須使用“每行的第二個字段”創建一個 map:“它是計數”。
我已嘗試使用以下 Jinja2 代碼,但不確定如何獲取每個項目的總數:

- set_fact:
    users: |-
      {%- set users = [] -%}
      {%- set u_dict = {} -%}
      {%- for i in str_lst -%}
         {{ users.append(i.split()[1]) }}
      {%- endfor -%}
      {%- for j in users -%}
        {{ u_dict.update({j:j.count(j)}) }}
      {%- endfor -%}
      {{ u_dict }}

- debug: var=users

Output:

"users": {
    "user1": 1,
    "user2": 1
}

預期 output:

"users": {
    "user1": 3,
    "user2": 2
}

任何想法,如何實現這一目標? 提前致謝

您可以使用名為listcount的自定義過濾器,例如:

在 playbook 文件夾中創建一個名為filter_plugins的文件夾,並創建一個名為customfilter.py的文件:

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

    def listcount(self, listvar):
        result = {}
        for l in listvar:
            item = l.split()[1]
            if item in result:
                result[item] += 1
            else:
                result[item] = 1

        return result

劇本:

- hosts: localhost
  vars:
    str_lst:
      - "someline    user1     OK     somedata    somecommand"
      - "someline    user1     OK     somedata    somecommand"
      - "someline    user1     OK     somedata    somecommand"
      - "someline    user2     OK     somedata    somecommand"
      - "someline    user2     OK     somedata    somecommand"
  tasks:
        
    - set_fact:
        users: "{{ str_lst | listcount }}"
    - debug:
        msg: "{{ users }}"

結果:

ok: [localhost] => {
    "msg": {
        "user1": 3,
        "user2": 2
    }
}

沒有 customfilter ,我已經測試了這個 jinja2 代碼,看起來還可以:

  tasks:
    - set_fact:
        users: |-
          {%- set dict = {} -%}
          {%- for l in str_lst -%}
          {%- set i = l.split()[1] -%}
          {%-  if i in dict -%}
          {%- set _ = dict.update({i: dict[i] + 1}) -%}      
          {%- else -%}
          {%- set _ = dict.update({i: 1}) -%}
          {%- endif -%}        
          {%- endfor -%}
          {{ dict }}
    - debug:
        msg: "{{ users }}"
    - debug:
        msg: "{{ users.user1 }}  {{ users.user2 }}"

暫無
暫無

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

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