Ansible список добавления на делегированном хосте - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть требование создать список на делегированном хосте. Вот что у меня так далеко. В задаче «поставь задачу» эта строка

---
- name: Test Play 1
  hosts: localhost
  gather_facts: no
  vars:
    devices:
      test1:
        hostname: host1
        interface: Gi1/43
      test2:
        hostname: host1
        interface: Gi1/44
      test3:
        hostname: host2
        interface: Gi1/1
      test4:
        hostname: host2
        interface: Gi1/2
  tasks:
    - name: Test Task 1
      debug:
        msg: "{{ devices }}"

    - name: Initiate empty list
      set_fact:
        device_list: []
      delegate_to: localhost

    - name: Add devices
      set_fact:
        device_list: "{{ device_list + [item.value.hostname] }}"
      delegate_to: localhost
      delegate_facts: True
      with_dict: "{{ devices }}"

    - name: Initialize shut interface
      set_fact:
        shut_interface: []
      delegate_to: "{{ item.value.hostname }}"
      delegate_facts: True
      with_dict: "{{ devices }}"

    - name: set the task
      set_fact:
        shut_interface: "{{ hostvars[item.value.hostname].shut_interface + [item.value.interface] }}"
      delegate_to: "{{ item.value.hostname }}"
      delegate_facts: True
      with_dict: "{{ devices }}"

- name: Test Play 2
  hosts: "{{ hostvars['localhost']['device_list'] }}"
  gather_facts: no
  tasks:
    - name: Tests 2
      debug:
        msg: "{{ shut_interface }}"

PLAY [Test Play 1] **************************************************************************************************************************************************************************************

TASK [Test Task 1] **************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": {
        "test1": {
            "hostname": "host1",
            "interface": "Gi1/43"
        },
        "test2": {
            "hostname": "host1",
            "interface": "Gi1/44"
        },
        "test3": {
            "hostname": "host2",
            "interface": "Gi1/1"
        },
        "test4": {
            "hostname": "host2",
            "interface": "Gi1/2"
        }
    }
}

TASK [Initiate empty list] ******************************************************************************************************************************************************************************
ok: [localhost -> localhost]

TASK [Add devices] **************************************************************************************************************************************************************************************
ok: [localhost -> localhost] => (item={'key': 'test1', 'value': {'hostname': 'host1', 'interface': 'Gi1/43'}})
ok: [localhost -> localhost] => (item={'key': 'test2', 'value': {'hostname': 'host1', 'interface': 'Gi1/44'}})
ok: [localhost -> localhost] => (item={'key': 'test3', 'value': {'hostname': 'host2', 'interface': 'Gi1/1'}})
ok: [localhost -> localhost] => (item={'key': 'test4', 'value': {'hostname': 'host2', 'interface': 'Gi1/2'}})

TASK [Initialize shut interface] ************************************************************************************************************************************************************************
ok: [localhost -> host1] => (item={'key': 'test1', 'value': {'hostname': 'host1', 'interface': 'Gi1/43'}})
ok: [localhost -> host1] => (item={'key': 'test2', 'value': {'hostname': 'host1', 'interface': 'Gi1/44'}})
ok: [localhost -> host2] => (item={'key': 'test3', 'value': {'hostname': 'host2', 'interface': 'Gi1/1'}})
ok: [localhost -> host2] => (item={'key': 'test4', 'value': {'hostname': 'host2', 'interface': 'Gi1/2'}})

TASK [set the task] *************************************************************************************************************************************************************************************
ok: [localhost -> host1] => (item={'key': 'test1', 'value': {'hostname': 'host1', 'interface': 'Gi1/43'}})
ok: [localhost -> host1] => (item={'key': 'test2', 'value': {'hostname': 'host1', 'interface': 'Gi1/44'}})
ok: [localhost -> host2] => (item={'key': 'test3', 'value': {'hostname': 'host2', 'interface': 'Gi1/1'}})
ok: [localhost -> host2] => (item={'key': 'test4', 'value': {'hostname': 'host2', 'interface': 'Gi1/2'}})

PLAY [Test Play 2] **************************************************************************************************************************************************************************************

TASK [Tests 2] ******************************************************************************************************************************************************************************************
ok: [host1] => {
    "msg": [
        "Gi1/44". 
    ]
}
ok: [host2] => {
    "msg": [
        "Gi1/2". 
    ]
}

Я ожидаю [Gi1 / 43, Gi1 / 44] для хоста 1 и [Gi1 / 1, Gi1 / 2] для хоста 2. Есть идеи?

Ответы [ 2 ]

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

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

---
- name: Test Play 1
  hosts: 127.0.0.1
  connection: local
  gather_facts: no
  vars:
    devices:
      test1:
        hostname: host1
        interface: Gi1/43
      test2:
        hostname: host1
        interface: Gi1/44
      test3:
        hostname: host2
        interface: Gi1/1
      test4:
        hostname: host2
        interface: Gi1/2
  tasks:
    - name: Test Task 1
      debug:
        var: devices

    - name: Add host_list
      set_fact:
        shut_interface_list: >-
          {{ shut_interface_list|default({})|combine({devices[item].hostname:
          (shut_interface_list[devices[item].hostname]|default([])) +
          [(devices[item]|default({'interface': ''})).interface]
          })
          }}
      loop: "{{ devices.keys()|list }}"

    - name: Test Task 2
      debug:
        var: shut_interface_list

    - name: Add testing hosts
      add_host:
        name: "{{ item }}"
        groups: test_group
        ansible_host: 127.0.0.1
      loop: "{{ shut_interface_list.keys()|list }}"

- name: Test Play 2
  hosts: test_group
  vars:
    shut_interfaces: "{{ hostvars['localhost']['shut_interface_list'][inventory_hostname] }}"
  gather_facts: no
  tasks:
    - name: Test Task 3
      debug:
        var: shut_interfaces

Что должно дать вам такой результат:

TASK [Test Task 3] ***********************************************************************************************************************************
ok: [host1] => {
    "shut_interfaces": [
        "Gi1/43",
        "Gi1/44"
    ]
}
ok: [host2] => {
    "shut_interfaces": [
        "Gi1/1",
        "Gi1/2"
    ]
}
0 голосов
/ 16 апреля 2020

Пожалуйста, исправьте объявление раздела vars. Поскольку вы определяете одни и те же имена хостов в два раза больше, чем ansible, считая последние определенные переменные как окончательные, и вы получаете вывод task2 как Gi1/44 и Gi1/2.

  vars:
    devices:
      test1:
        hostname: host1
        interface:
          - Gi1/43
          - Gi1/44
      test2:
        hostname: host2
        interface:
          - Gi1/1
          - Gi1/2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...