Arhn - архитектура программирования

возможное обновление файла YAML с помощью set_fact/update_fact

Мой проект ansible состоит из 6 ролей (app, db, init, ror, tick, web). Каждая роль представляет собой установку одного компонента системы. Каждое устройство отслеживает, какие роли были установлены, используя файл /etc/ansible/ansible-install-state.yml. Его исходное содержимое:

# ansible-install-state.yml
#
#
# This file is maintained by Ansible
# Please leave it alone, or accept the consequences!
#

roles:
  app:
    installed: false
  db:
    installed: false
  init:
    installed: false
  ror:
    installed: false
  tick:
    installed: false
  web:        
    installed: false

По завершении роли «инициализация» я хочу обработать файл, чтобы обновить установленное состояние до «истинного». Я делаю это с помощью следующего вызова. (Для тестирования я также устанавливаю «ror: true» и добавляю новую роль «new: unknown»

  - name: System Init | Process ansible_install_state
    ansible.builtin.include_tasks:  process_ansible_install_state.yml
    with_items:
      - role: { key: init, value: true }
      - role: { key: ror, value: true }
      - role: { key: new, value: unknown}
 

Обновление существующих ролей прошло довольно гладко, а вот добавление новой роли — нет. Наконец, я заставил его работать, сначала добавив саму роль, по сути, «новая: {}», а затем снова изменив ее, добавив часть «установлено: неизвестно». Хотя это действительно работает, я не могу не верить, что есть лучший способ — способ сделать все сразу. Ниже приведен файл process_enable_install_state.yml.

---
# process_ansible_install_state.yml

#
#------------------------- Process Ansible Install State File
#

- name: display variable
  debug: 
    var: item

# See https://stackoverflow.com/questions/32994002/is-there-a-yaml-editing-module-for-ansible
- name: Ansible Install State | Read ansible-install-state.yml  
  ansible.builtin.slurp: 
    path: "/etc/ansible/ansible-install-state.yml"
  register: install_state

- name: Ansible Install State | Decode and save yaml as fact
  ansible.builtin.set_fact:
    my_roles: "{{ install_state['content'] | b64decode | from_yaml }}"
  register: its_a_fact

- name: Ansible Install State | Save the new ROLE block
  block: 
 
  - name: Ansible Install State |  Save the new role
    ansible.utils.update_fact:
      updates:
      - path: my_roles.roles.{{ item.role.key }}
        value: {}
    register: updated

  # Update_fact does not update 'in place', so we need to save it as a fact
  - name: Ansible Install State | Update the saved 'fact'
    ansible.builtin.set_fact:
      my_roles: "{{ updated.my_roles}}"

  when: my_roles.roles[item.role.key] is undefined

- name: debug
  debug: 
    var: updated

- name: Ansible Install State | Update the role's installed state
  ansible.utils.update_fact:
    updates:
    - path: my_roles.roles.{{ item.role.key }}.installed
      value: "{{item.role.value}}"
  register: updated

- name: debug
  debug: 
    var: updated

# Update_fact does not update 'in place', so we need to save it as a fact
- name: Ansible Install State | Save modified as 'fact'
  ansible.builtin.set_fact:
    my_roles: "{{ updated.my_roles}}"

- name: Ansible Install State | Write Yaml File
  ansible.builtin.copy:    
    content: '{{ my_roles | to_nice_yaml }}'
    dest: "/etc/ansible/ansible-install-state.yml" 

- name: Ansible Install State | Insert Header Comments
  ansible.builtin.blockinfile:
    path: "/etc/ansible/ansible-install-state.yml"
    insertbefore: BOF
    marker: "#{mark}"
    marker_begin: "-------------------------------------------"
    marker_end:   "-------------------------------------------"
    block: |
      # ansible-install-state.yml
      #
      #
      # This file is maintained by Ansible
      # Please leave it alone, or accept the consequences!
      #
      #


Это успешно произвело...

# ansible-install-state.yml
#
#
# This file is maintained by Ansible
# Please leave it alone, or accept the consequences!
#
#
#-------------------------------------------
roles:
    app:
        installed: false
    db:
        installed: false
    init:
        installed: true
    new:
        installed: unknown
    ror:
        installed: true
    tick:
        installed: false
    web:
        installed: false
deploy@rpi-tick2:/etc/ansible $ 

29.07.2021


Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..