Ansible jinja2 сравнивает строки без учета регистра - PullRequest
0 голосов
/ 24 апреля 2020

у меня следующий сложный словарь (это всего лишь пример). Я пытаюсь получить список всех идентификаторов, которые принадлежат server1. Имя сервера1 в смешанных случаях. Я пробовал jinja2 фильтры, такие как совпадение, поиск, равно, но ни один из них не возвращает ожидаемый результат. Также пробовал 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\") }}"

1 Ответ

1 голос
/ 24 апреля 2020

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

Playbook:

- 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

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

...