बनाने के लिए शब्दकोश के साथ सामग्री की एक सूची है और यह गिनती के साथ Ansible का उपयोग कर Jinja2

0

सवाल

मैं एक सूची के रूप में नीचे:

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"

मैं बनाने के लिए एक नक्शा के साथ 'दूसरे क्षेत्र से प्रत्येक लाइन' : 'यह गणना'.
मैंने कोशिश की है के साथ नीचे 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

आउटपुट:

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

उम्मीद उत्पादन:

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

किसी भी विचार करने के लिए कैसे, इस लक्ष्य को हासिल? धन्यवाद अग्रिम में

ansible jinja2
2021-11-23 15:08:53
1

सबसे अच्छा जवाब

1

आप इस्तेमाल कर सकते हैं एक कस्टम फ़िल्टर नाम listcount उदाहरण के लिए:

नाम का फ़ोल्डर बनाएँ filter_plugins में अपने playbook फ़ोल्डर बनाने के लिए और एक फ़ाइल नाम 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 }}"
2021-11-23 16:47:40

कि अच्छी तरह से काम किया. धन्यवाद!
Vijesh

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................