Я пытаюсь отфильтровать следующие данные на основе наличия 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, но мне кажется, что я что-то упускаю.
Вы можете использовать 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") }}'