微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从 Ansible 中的列值获取列名

如何解决如何从 Ansible 中的列值获取列名

我有一个具有以下结构的 csv 文件

create

如果日期与今天的日期匹配,我想写一个 ansible play 来打印列名 已经找出日期匹配逻辑但无法获得匹配日期的相应列名。

解决方法

问:"如果日期与今天的日期匹配,则打印列名称。"

A:先解析数据。由于缺少分隔符,模块 read_csv 不会解析此文件。修复它,例如

    - replace:
        path: test.csv
        regexp: '(\S)[^\S\n]+(\S)'
        replace: '\1;\2'

给予

shell> cat test.csv
aday;bday;cday
12-2-2021;12-2-2021;12-2-2021
13-3-2021;12-9-2021;13-1-2021
15-6-2021;12-9-2021;16-2-2021

现在,使用 read_csv,例如

    - read_csv:
        path: test.csv
        delimiter: ';'
      register: days
    - debug:
        var: days

给予

  days:
    changed: false
    dict: {}
    failed: false
    list:
    - aday: 12-2-2021
      bday: 12-2-2021
      cday: 12-2-2021
    - aday: 13-3-2021
      bday: 12-9-2021
      cday: 13-1-2021
    - aday: 15-6-2021
      bday: 12-9-2021
      cday: 16-2-2021

用列创建字典

    - set_fact:
        days_dict: "{{ days_dict|d({})|
                       combine({item: days.list|
                                      map(attribute=item)|
                                      list}) }}"
      loop: "{{ days.list.0.keys()|list }}"

给予

  days_dict:
    aday:
    - 12-2-2021
    - 13-3-2021
    - 15-6-2021
    bday:
    - 12-2-2021
    - 12-9-2021
    - 12-9-2021
    cday:
    - 12-2-2021
    - 13-1-2021
    - 16-2-2021

现在,选择包含今天日期的列,例如

    - set_fact:
        cols_today: "{{ cols_today|d([]) + [item.key] }}"
      loop: "{{ days_dict|dict2items }}"
      vars:
        today: '13-1-2021'
      when: today in item.value

给予

  cols_today:
  - cday

过滤器 json_query 给出相同的结果

    - set_fact:
        cols_today: "{{ days_dict|dict2items|json_query(my_query) }}"
      vars:
        today: '13-1-2021'
        my_query: "[?value.contains(@,'{{ today }}')].key"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。