Как обращаться к списку во время цикла with_dict - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь создать 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

1 Ответ

0 голосов
/ 25 марта 2020

Q: "Есть ли способ создать словарь и добавить к нему новые значения позже?"

A: Да. Возможно. Давайте создадим словарь с данными

    - set_fact:
        mylist: "{{ reg_CurrentVersion.results|
                    json_query('[].{instance: item.key,
                                    registry: item.value.raw_value,
                                    version: raw_value}') }}"
    - debug:
        var: mylist

дает

    "mylist": [
        {
            "instance": "SQL2014", 
            "registry": "MSSQL12.SQL2014", 
            "version": "12.0.6024.0"
        }, 
        {
            "instance": "SQL2016", 
            "registry": "MSSQL13.SQL2016", 
            "version": "13.2.5026.0"
        }, 
        {
            "instance": "MSSQLSERVER", 
            "registry": "MSSQL11.MSSQLSERVER", 
            "version": "11.0.7001.0"
        }, 
        {
            "instance": "SQL2017", 
            "registry": "MSSQL14.SQL2017", 
            "version": "14.0.1000.169"
        }
    ]

Добавить имя хоста в каждый словарь

    - set_fact:
        mylist2: "{{ mylist2|default([]) +
                     [item|combine({'hostname': inventory_hostname})] }}"
      loop: "{{ mylist }}"
    - debug:
        var: mylist2

дает

    "mylist2": [
        {
            "hostname": "localhost", 
            "instance": "SQL2014", 
            "registry": "MSSQL12.SQL2014", 
            "version": "12.0.6024.0"
        }, 
        {
            "hostname": "localhost", 
            "instance": "SQL2016", 
            "registry": "MSSQL13.SQL2016", 
            "version": "13.2.5026.0"
        }, 
        {
            "hostname": "localhost", 
            "instance": "MSSQLSERVER", 
            "registry": "MSSQL11.MSSQLSERVER", 
            "version": "11.0.7001.0"
        }, 
        {
            "hostname": "localhost", 
            "instance": "SQL2017", 
            "registry": "MSSQL14.SQL2017", 
            "version": "14.0.1000.169"
        }
    ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...