Ansible jinja2 сравнивает строки без учета регистра

У меня есть следующий сложный словарь (это всего лишь образец). И я пытаюсь получить список всех идентификаторов, принадлежащих server1. Имя server1 в смешанном регистре.

Я пробовал фильтры jinja2, такие как match, search, equalto, но ни один из них не дает ожидаемого результата. Также пробовал запрос JSON, но все еще не знал, как использовать нижний или верхний регистр для сравнения с работой.

    ---
    - name: TEST
      hosts: localhost
      gather_facts: no
    
      vars:
        datacenters: {
          cabinets: {
            servers: [
              {
                name: Server1,
                id: 1
              },
              {
                name: SERVER1,
                id: 2
              },
              {
                name: Server2,
                id: 3
              },
              {
                name: server1,
                id: 4
              },
             ]
          }
        }
    
      tasks:
        - name: get ids for Server 1 
          set_fact:
            ids: "{{ datacenters.cabinets.servers
              | selectattr('name','match','Server1')
              | map(attribute='id')
              | list }}"
    
        - debug:
              var: ids
    
        - debug: msg="{{ datacenters | json_query(\"cabinets.servers[?name == 'Server1'].id\") }}"

person Marek    schedule 24.04.2020    source источник


Ответы (1)


Этого можно добиться с помощью фильтров when и lower в ansible. Приведенная ниже книга работает для меня.

Практика:

- name: Demo of restore plan
  hosts: localhost
  gather_facts: False
  vars:
    datacenters: {
        cabinets: {
          servers: [
            {
              name: Server1,
              id: 1
            },
            {
              name: SERVER1,
              id: 2
            },
            {
              name: Server2,
              id: 3
            },
            {
              name: server1,
              id: 4
            },
          ]
        }
      }
  tasks:
    - debug:
        msg: "{{ item.name }}"
      with_items:
        - "{{ datacenters.cabinets.servers }}"
      when: item.name|lower == "server1"

Вывод:

[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'


PLAY [Demo of restore plan] ************************************************************************************************************************************************

TASK [debug] ***************************************************************************************************************************************************************
ok: [localhost] => (item={'name': 'Server1', 'id': 1}) => {
    "msg": "Server1"
}
ok: [localhost] => (item={'name': 'SERVER1', 'id': 2}) => {
    "msg": "SERVER1"
}
skipping: [localhost] => (item={'name': 'Server2', 'id': 3})
ok: [localhost] => (item={'name': 'server1', 'id': 4}) => {
    "msg": "server1"
}

PLAY RECAP *****************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Ansible отображает только строку server1 и игнорирует строку server2.

Надеюсь, это поможет

person error404    schedule 24.04.2020
comment
это правильный ответ. Знаете ли вы, есть ли способ добиться того же, не используя цикл, а синтаксис jinja2? - person Marek; 22.07.2020