Фильтрация словарей на основе наличия ключа в подсловаре

Я пытаюсь отфильтровать следующие данные на основе наличия username в подсловаре.

Оптимальным решением было бы, когда мне не нужно упоминать каждый ключ, например. agtsvcaccount, sqlsvcaccount, sapwd, потому что это должно быть общим в других схемах.

Это пример ввода с переменной input_parameters, этот вывод взят из задачи отладки Ansible.

ok: [localhost] => {
    "msg": {
        "ansible": {
            "limit": [
                "vm1234.vmdomain.com",
                "vm5678.vmdomain.com"
            ]
        },
        "mssql": {
            "edition": "standard",
            "language": "en",
            "setupconfig": {
                "action": "Install",
                "agtsvcaccount": {
                    "type": "System User",
                    "username": "SQL_Agt",
                    "vault": "credvault",
                    "visibility": false
                },
                "agtsvcstartuptype": "Automatic",
                "features": [
                    "SQLENGINE"
                ],
                "forcereboot": false,
                "instancename": "MSSQLINSTANCE",
                "npenabled": true,
                "sapwd": {
                    "type": "Database",
                    "username": "sa",
                    "vault": "credvault",
                    "visibility": false
                },
                "securitymode": "SQL",
                "sqlcollation": "SQL_Latin1_General_CP1_CI_AS",
                "sqlsvcaccount": {
                    "type": "System User",
                    "username": "SQL_Svc",
                    "vault": "credvault",
                    "visibility": false
                },
                "sqlsvcstartuptype": "Automatic",
                "sqlsysadminaccounts": [
                    "Administrator"
                ],
                "tcpenabled": true
            },
            "version": "2022"
        }
    }
}

Прямо сейчас я использую что-то подобное, что не является достаточно общим/динамичным, и я не хочу использовать account_identifiers для других схем, которые очень похожи.

- name: 'Process credentials'
  ansible.builtin.include_role:
    name: 'mycollection.generic'
    tasks_from: 'user/{{ item.value.vault }}.yml'
  loop: '{{ input_parameters.mssql.setupconfig | dict2items }}'
  when: 'item.key in account_identifiers'
  vars:
    account_identifiers: ['sapwd','sqlsvcaccount','agtsvcaccount','ftsvcaccount','rssvcaccount','assvcaccount','issvcaccount']

Есть идеи, как это сделать?
Я пытался почерпнуть идею из документации Ansible, но мне кажется, что я что-то упускаю.

Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
4
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать selectattr в списке словарей, созданных вашим dict2items, чтобы проверить, определено ли свойство этих словарей.

Итак, ваш цикл в конечном итоге будет таким:

loop: >-
  {{ 
    input_parameters.mssql.setupconfig 
      | dict2items 
      | selectattr('value.username', 'defined') 
  }}

С упрощенной задачей debug для ваших входных данных:

- debug:
    msg: "Username: {{ item.value.username }}"
  loop_control:
    label: "{{ item.key }}"
  loop: >-
      {{
        input_parameters.mssql.setupconfig
          | dict2items
          | selectattr('value.username', 'defined')
      }}

Вы получите:

ok: [localhost] => (item=agtsvcaccount) => 
  msg: 'Username: SQL_Agt'
ok: [localhost] => (item=sapwd) => 
  msg: 'Username: sa'
ok: [localhost] => (item=sqlsvcaccount) => 
  msg: 'Username: SQL_Svc'

Это может сработать именно так, как мне было нужно. Похоже, у меня просто была неправильная комбинация параметров с помощью selectattr — спасибо! Он работает с моей строкой отладки без цикла — думаю, это решение будет отлично работать в моей среде: msg: '{{ input_parameters.mssql.setupconfig | dict2items | selectattr("value.username", "defined") }}'

Daniel Koerner 24.06.2024 21:58

Другие вопросы по теме