Копирование данных между словарями в Ansible - PullRequest
0 голосов
/ 08 января 2020

У меня есть следующая исходная структура данных в файле yml:

animals:
  dogs:
    - { breed: "Golden Retriever", colour: "Golden" }
    - { breed: "Rottweiler", colour: "Black" }
    - { breed: "Labrador", colour: "Brown", "Black", "Cream" } 

Я пытаюсь открыть файл l oop через структуру данных и скопировать его, чтобы я завершил работу. с точной копией данных. Вот так:

animals:
  dogs:
    - { breed: "Golden Retriever", colour: "Golden" }
    - { breed: "Rottweiler", colour: "Black" }
    - { breed: "Labrador", colour: "Brown", "Black", "Cream" } 

animals:
  dogs:
    - { breed: "Golden Retriever", colour: "Golden" }
    - { breed: "Rottweiler", colour: "Black" }
    - { breed: "Labrador", colour: "Brown", "Black", "Cream" } 

Мне также нужно иметь возможность добавлять и удалять данные из источника данных источника, и при повторном запуске книги воспроизведения копируемые данные также обновляются.

Я потратил немного времени на просмотр этого и дошел до того, что это не очень хорошо, поскольку оно не дает мне того, что я хочу:

- name: test
  hosts: localhost
  connection: local

  tasks:

    - name: Read the yaml
      slurp:
        path: ./animals.yml
      register: r_myfile

    - debug:
        var: r_myfile

    - name: Extract the data
      set_fact:
        mydata: "{{ r_myfile['content'] | b64decode | from_yaml }}"

    - debug:
        var: mydata

    - name: Populating the list of dictionaries in new dictionary
      blockinfile:
        dest: ./animals.yml
        block: "{{ mydata }}"

Это что дает мне вышеперечисленная пьеса:

animals:
  dogs:
    - { breed: "Golden Retriever", colour: "Golden" }
    - { breed: "Rottweiler", colour: "Black" }
    - { breed: "Labrador", colour: "Brown", "Black", "Cream" } 


# BEGIN ANSIBLE MANAGED BLOCK
{'animals': {'dogs': [{'colour': 'Golden', 'breed': 'Golden Retriever'}, {'colour': 'Black', 'breed': 'Rottweiler'}, {'colour': 'Brown', 'breed': 'Labrador', 'Black': None, 'Cream': None}]}}
# END ANSIBLE MANAGED BLOCK

Любая помощь или указатели будут высоко оценены

1 Ответ

0 голосов
/ 08 января 2020

Итак, я придумал следующее решение, чтобы заставить нас двигаться. Нам потребовалось изменить исходную структуру данных, что не представляло особой проблемы.

Новый формат структуры данных в моем файле yml:

animals:
  dogs:
    - breed: "Golden Retriever" 
      colour: "Golden" 
    - breed: "Rottweiler" 
      colour: "Black"
    - breed: "Labrador" 
      colour: 
      - "Brown" 
      - "Black" 
      - "Cream"

Вот так выглядит мой новый playbook:

- name: test
  hosts: localhost
  connection: local
  vars_files:
    - ./animals.yml
  vars:
    new_dict: "new_animals"
    new_item: "new_dogs"

  tasks:

    - debug:
        var: animals.dogs

    - name: Insert/Update data
      blockinfile:
        block: |
          {{ new_dict }}:
            {{ new_item }}:
              {{ animals.dogs | to_nice_yaml(width=80, indent=2) | indent(4) }}
        dest: ./animals.yml

Решение позволяет мне назначать новое имя новому словарю и элементу, а также возможность обновлять структуру данных источника, которая будет выбрана и применена к новому словарю.

Надеюсь, это имеет смысл, и если у кого-то есть лучший способ сделать это, пожалуйста, дайте мне знать.

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