如何使用 jinja groupby 过滤器或其他过滤器在 Ansible 代码中过滤字符串或数组

时间:2021-04-21 09:29:52

标签: filter ansible yaml

基本上,我有两个列表:

- name:
  set_fact:
    list1:
      - host: '[\"X.XXX.XX.XXX\"]'
        username: username1
      - host: '[\"X.XXX.XX.XXX\"]'
        username: username2
      - host: '[\"X.XXX.XX.XXX\"]'
        username: username3
      - host: 
        - '[\"XX.XXX.XX.XXX\"]' 
        - '[\"XX.X.X.XXX\"]'
        username: username4
      - host: '[\"XX.X.X.XXX\"]'
        username: username5
      - host: '[\"localhost\"]'
        username: username6
      - host: '[\"XX.XXX.XX.XXX\"]'
        username: username7
    list2: 
      - host: 'X.XXX.XX.XXX'
        username: username1
      - host: 'localhost'
        username: username2
      - host: 'XX.XXX.XX.XXX'
        username: username3
      - host: 'localhost'
        username: username4
      - host: 'XX.X.X.XXX'
        username: username5
  tags: [diff]

我想做的是区分用户名有一个或多个ip的情况。为此,我尝试使用 Jinja2 groupby 过滤器。

例如, {% if list1.host 是字符串%} ... {% elif list.host 是数组%} ... {% endif %}
我唯一的提示是,当一个用户名有一个 ip 时,ansible 代码返回一个字符串或 ip,但是当多个 ips 时,它返回一个包含 ips 的数组。

所以,我的问题是当它是带有 Ansible 过滤器的字符串或数组时,我无法捕捉和区分大小写。这是我的ansible代码:

- name: Comparison of two lists
  debug: 
    msg: |
      {% if list1_host is string %}
      It is a string.
      {% else %}
      It's not a string.
      {% endif %}
  loop: "{{ list1 | product(list2) | list }}"
  when: 
    - list1_username == list2_username
  register: output
  tags: [diff]
  vars: 
    list1_host: "{{ (item.0.host | replace('[\\\"','') | replace('\\\"]','')) }}"
    list1_username: "{{ item.0.username }}"
    list2_host: "{{ item.1.host }}"
    list2_username: "{{ item.1.username }}"
    length: "{{ item.0.host | length }}"

有人知道吗?

感谢您的帮助。

0 个答案:

没有答案
相关问题