Я пытаюсь создать playbook, который динамически запрашивает реестр Windows для обнаружения установленных экземпляров SQL Сервера (или чего-либо еще), его версии, местоположения и т. Д. c. и делать действие X для каждого экземпляра. Это работает нормально, если установлен только один экземпляр SQL, но я не уверен, как этого добиться в среде с несколькими экземплярами, так как я смешиваю подсказки и список, и я не уверен, как это решить ..
В качестве простого примера Playbook ниже обнаруживает установленные SQL экземпляры на основе ключей reg и проверяет версию SQL для каждого экземпляра. Я хотел бы выводить информацию для каждого экземпляра (или даже лучше поместить ее в переменную dict, чтобы я мог использовать ее позже и добавить больше деталей на основе других ключей reg).
Проблема в том, что некоторые возвращаемые данные являются списком, и я не уверен, как добавить их в l oop (или добавить, чтобы указать, где ключ, например, экземпляр).
Код:
- name: 'Go to Windows registry and check if any SQL instance is installed - using win_reg_stat module'
win_reg_stat:
path: HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL
register: reg_InstalledInstances
- name: 'Go to Windows registry and for each installed instance get its version number'
win_reg_stat:
path: HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\{{item.value.raw_value}}\MSSQLServer\CurrentVersion
name: CurrentVersion
with_dict: '{{reg_InstalledInstances.properties}}'
register: reg_CurrentVersion
- debug:
msg:
- '{{reg_CurrentVersion}}'
- name: 'Show all the details'
debug:
msg:
- 'Hostname: {{inventory_hostname}}'
- 'SQL Instance: {{item.key}}'
- 'SQL Instance in Registry: {{item.value.raw_value}}'
#- 'CurrentVersion: {{reg_CurrentVersion.results.raw_value}}'
with_dict: '{{reg_InstalledInstances.properties}}'
- name:
debug:
msg:
- '{{reg_CurrentVersion}}'
Проблема: я не уверен, как передать reg_CurrentVersion в l oop - в l oop (я пытался {{reg_CurrentVersion.results.item .raw_value}} также):
...
- 'CurrentVersion: {{reg_CurrentVersion.results.raw_value}}'
with_dict: '{{reg_InstalledInstances.properties}}'
приводит к:
the task includes an option with an undefined variable. The error was: 'list object' has no attribute 'raw_value'
reg_CurrentVersion сам по себе работает нормально и выглядит так:
ok: [gbltcdevcmdr01] => {
"msg": [
{
"changed": false,
"msg": "All items completed",
"results": [
{
"ansible_loop_var": "item",
"changed": false,
"exists": true,
"failed": false,
"item": {
"key": "SQL2014",
"value": {
"raw_value": "MSSQL12.SQL2014",
"type": "REG_SZ",
"value": "MSSQL12.SQL2014"
}
},
"raw_value": "12.0.6024.0",
"type": "REG_SZ",
"value": "12.0.6024.0"
},
{
"ansible_loop_var": "item",
"changed": false,
"exists": true,
"failed": false,
"item": {
"key": "SQL2016",
"value": {
"raw_value": "MSSQL13.SQL2016",
"type": "REG_SZ",
"value": "MSSQL13.SQL2016"
}
},
"raw_value": "13.2.5026.0",
"type": "REG_SZ",
"value": "13.2.5026.0"
},
{
"ansible_loop_var": "item",
"changed": false,
"exists": true,
"failed": false,
"item": {
"key": "MSSQLSERVER",
"value": {
"raw_value": "MSSQL11.MSSQLSERVER",
"type": "REG_SZ",
"value": "MSSQL11.MSSQLSERVER"
}
},
"raw_value": "11.0.7001.0",
"type": "REG_SZ",
"value": "11.0.7001.0"
},
{
"ansible_loop_var": "item",
"changed": false,
"exists": true,
"failed": false,
"item": {
"key": "SQL2017",
"value": {
"raw_value": "MSSQL14.SQL2017",
"type": "REG_SZ",
"value": "MSSQL14.SQL2017"
}
},
"raw_value": "14.0.1000.169",
"type": "REG_SZ",
"value": "14.0.1000.169"
}
]
}
]
}
EDIT :
в тот момент, когда я запускаю исходный код:
...
- name: 'Show all the details'
debug:
msg:
- 'Hostname: {{inventory_hostname}}'
- 'SQL Instance: {{item.key}}'
- 'SQL Instance in Registry: {{item.value.raw_value}}'
#- 'CurrentVersion: {{reg_CurrentVersion.results.raw_value}}'
with_dict: '{{reg_InstalledInstances.properties}}'
Я получил это:
ok: [testhost] => (item={'key': 'SQL2014', 'value': {'raw_value': 'MSSQL12.SQL2014', 'value': 'MSSQL12.SQL2014', 'type': 'REG_SZ'}}) => {
"msg": [
"Hostname: testhost",
"SQL Instance: SQL2014",
"SQL Instance in Registry: MSSQL12.SQL2014"
]
}
ok: [testhost] => (item={'key': 'SQL2016', 'value': {'raw_value': 'MSSQL13.SQL2016', 'value': 'MSSQL13.SQL2016', 'type': 'REG_SZ'}}) => {
"msg": [
"Hostname: testhost",
"SQL Instance: SQL2016",
"SQL Instance in Registry: MSSQL13.SQL2016"
]
}
ok: [testhost] => (item={'key': 'MSSQLSERVER', 'value': {'raw_value': 'MSSQL11.MSSQLSERVER', 'value': 'MSSQL11.MSSQLSERVER', 'type': 'REG_SZ'}}) => {
"msg": [
"Hostname: testhost",
"SQL Instance: MSSQLSERVER",
"SQL Instance in Registry: MSSQL11.MSSQLSERVER"
]
}
ok: [testhost] => (item={'key': 'SQL2017', 'value': {'raw_value': 'MSSQL14.SQL2017', 'value': 'MSSQL14.SQL2017', 'type': 'REG_SZ'}}) => {
"msg": [
"Hostname: testhost",
"SQL Instance: SQL2017",
"SQL Instance in Registry: MSSQL14.SQL2017"
]
}
Я хотел бы просто добавить reg_CurrentVersion.results.raw_value в качестве дополнительной строки для каждого экземпляра. Примерно так:
ok: [testhost] => (item={'key': 'SQL2014', 'value': {'raw_value': 'MSSQL12.SQL2014', 'value': 'MSSQL12.SQL2014', 'type': 'REG_SZ'}}) => {
"msg": [
"Hostname: testhost",
"SQL Instance: SQL2014",
"SQL Instance in Registry: MSSQL12.SQL2014"
"CurrentVersion: 12.0.6024.0"
]
}
ok: [testhost] => (item={'key': 'SQL2016', 'value': {'raw_value': 'MSSQL13.SQL2016', 'value': 'MSSQL13.SQL2016', 'type': 'REG_SZ'}}) => {
"msg": [
"Hostname: testhost",
"SQL Instance: SQL2016",
"SQL Instance in Registry: MSSQL13.SQL2016"
"CurrentVersion: 13.2.5026.0"
]
}
ok: [testhost] => (item={'key': 'MSSQLSERVER', 'value': {'raw_value': 'MSSQL11.MSSQLSERVER', 'value': 'MSSQL11.MSSQLSERVER', 'type': 'REG_SZ'}}) => {
"msg": [
"Hostname: testhost",
"SQL Instance: MSSQLSERVER",
"SQL Instance in Registry: MSSQL11.MSSQLSERVER"
"CurrentVersion: 11.0.7001.0"
]
}
ok: [testhost] => (item={'key': 'SQL2017', 'value': {'raw_value': 'MSSQL14.SQL2017', 'value': 'MSSQL14.SQL2017', 'type': 'REG_SZ'}}) => {
"msg": [
"Hostname: testhost",
"SQL Instance: SQL2017",
"SQL Instance in Registry: MSSQL14.SQL2017"
"CurrentVersion: 14.0.1000.169"
]
}
PS. Есть ли способ создать dict и добавить к нему новые значения позже?
Tomasz