Ansible: Создать дикт из файла - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь создать dict из файла var из здесь и здесь , но безуспешно.

Я импортирую файл var, который выглядит следующим образом (идентификатор виртуальной машины определяется ключом)

---
k8s_vms:
  888:
    ip: 10.0.30.110
    mac: ca:d1:23:45:4e:01
  999:  
    ip: 10.0.30.111
    mac: ca:d1:23:45:4e:02
...

В моей книге воспроизведения я написал это для отладки:

pre_tasks:
    - include_vars: 'vm_vars.yml'

[...]

 - name: Populate dict (test with IP)
      set_fact:
        vms_infos: "{{ vms_infos | default([]) + [ {'id': item.key, 'ip': item.value.ip} ] }}"
      with_items:
        - "{{ k8s_vms }}"

 - name: Debug
   debug: var=vms_infos

 - name: ID and  IP
   debug:
     msg: "VM={{ item.id }}, IP={{ item.ip }}"
   with_items: "{{ vms_infos }}"

Я не могу найти способ доступа к значениям, поэтому мой вывод выглядит следующим образом:

TASK [DEBUG] ***********************************************************************************************************************
ok: [x.x.x.x] => {
    "k8s_vms": {
        "888": {
            "ip": "10.0.30.110",
            "mac": "ca:d1:23:45:4e:01"
        },
        "999": {
            "ip": "10.0.30.111",
            "mac": "ca:d1:23:45:4e:02"
        }
    }
}

TASK [Populate dict] ***************************************************************************************************************
ok: [x.x.x.x] => (item={888: {'ip': '10.0.30.110', 'mac': 'ca:d1:23:45:4e:01'}, 999: {'ip': '10.0.30.111', 'mac': 'ca:ca:d1:23:45:4e:02'}})

TASK [DEBUG] ***********************************************************************************************************************
ok: [x.x.x.x] => {
    "vms_infos": "[{'id': AnsibleUndefined, 'ip': AnsibleUndefined}]"
}

TASK [ID and  IP] ******************************************************************************************************************
fatal: [x.x.x.x]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'id'\n\nThe error appears to be in 'xxx/deploy.yml': line 31, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n    - name: ID and  IP\n      ^ here\n"}

1 Ответ

0 голосов
/ 28 апреля 2020

В этом задании ...

 - name: Populate dict (test with IP)
      set_fact:
        vms_infos: "{{ vms_infos | default([]) + [ {'id': item.key, 'ip': item.value.ip} ] }}"
      with_items:
        - "{{ k8s_vms }}"

... вы пытаетесь получить доступ к item.key и item.value, но item не будет иметь этих атрибутов. Вы перебираете словарь (k8s_vms), что означает, что вы получите список ключей. Таким образом, item будет иметь значение 888 в первый раз и 999 во второй раз.

Кроме того, эта задача называется "populate dict", но вы фактически создаете список, который может запутать любого, кто читает вашу пьесу.

Возможно, вы захотите использовать фильтр dict2items:

- name: populate vm_infos list
  set_fact:
    vms_infos: "{{ vms_infos + [{'id': item.key, 'ip': item.value.ip}] }}"
  loop: "{{ k8s_vms|dict2items }}"
  vars:
    vms_infos: []

Вот пример книги, в которой это делается:

- hosts: localhost
  gather_facts: false
  vars:
    k8s_vms:
      888:
        ip: 10.0.30.110
        mac: ca:d1:23:45:4e:01
      999:
        ip: 10.0.30.111
        mac: ca:d1:23:45:4e:02

  tasks:
    - name: populate vm_infos list
      set_fact:
        vms_infos: "{{ vms_infos + [{'id': item.key, 'ip': item.value.ip}] }}"
      loop: "{{ k8s_vms|dict2items }}"
      vars:
        vms_infos: []

    - debug:
        var: vms_infos

Запуск, который производит:


PLAY [localhost] ******************************************************************************

TASK [populate vm_infos list] *****************************************************************
ok: [localhost] => (item={'key': 888, 'value': {'ip': '10.0.30.110', 'mac': 'ca:d1:23:45:4e:01'}})
ok: [localhost] => (item={'key': 999, 'value': {'ip': '10.0.30.111', 'mac': 'ca:d1:23:45:4e:02'}})

TASK [debug] **********************************************************************************
ok: [localhost] => {
    "vms_infos": [
        {
            "id": 888,
            "ip": "10.0.30.110"
        },
        {
            "id": 999,
            "ip": "10.0.30.111"
        }
    ]
}

PLAY RECAP ************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...