創建包含列表內容的字典,並使用 Jinja2 使用 Ansible 對其進行計數

維杰什

我有一個列表如下:

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
}

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

法式

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

創建一個文件夾命名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 }}"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ansible - 使用 jinja2 创建字典列表

Ansible:如何使用 Jinja2 创建嵌套字典

使用 jinja2 (ansible) 从列表中生成对

Yaml/Jinja2/Ansible 使用 jinja 模板处理字典列表

Ansible:如何使用条件压缩jinja2模板

使用Ansible我如何用Jinja2替换变量

使用jinja2计算设定差(在ansible中)

Ansible jinja2 模板使用变量进行查找

ansible 使用 jinja2 裁剪子字符串

使用Jinja2在ansible中创建字典列表时出现问题

ansible、jinja2、json - 在 Jinja 中使用 json_query?

如何使用for循环在Ansible Jinja2模板中的一行中添加一列?

我需要使用jinja2和ansible中的csv文件生成ansible-playbook

jinja2 Ansible过滤字典

使用 ansible/jinja2 將地圖過濾器應用於字典的值

如何使用Ansible / Jinja2将字符串拆分为列表?

使用Ansible在Jinja2中转义特殊的XML字符

如果使用“ when”,则ansible jinja2模板定界符将失败

如何使用Ansible或Jinja2在变量名中转义冒号(“:”)?

Ansible / jinja2:在满足条件的情况下使用过滤器结果

使用 Ansible 和 Jinja2 将 Unicode 转换为字符串

我怎么知道我的Ansible使用的是哪个版本的Jinja2?

在Ansible Jinja2模板的默认过滤器中使用变量

在ansible中使用jinja2時如何避免臨時文件

使用jinja2模板在ansible中解析输出(将字符串列表映射到字符串列表)

宏是否總是在使用 Jinja2 的表達式之前進行評估

修改Ansible / Jinja2中的列表项

在 Ansible/Jinja2 中格式化项目列表

无法解析Ansible Jinja2中的JSON列表