Ansible редактировать несколько атрибутов с одинаковым именем в файле XML

#xml #ansible

#xml #ansible

Вопрос:

Я пытаюсь отредактировать файлы конфигурации для различных серверов, используя Ansible, и столкнулся с XML-документом, который имеет несколько атрибутов с одинаковым именем, где значение необходимо скорректировать в зависимости от состояния сервера. Сокращенный файл конфигурации выглядит следующим образом:

 <?xml version="1.0" encoding="UTF-8"?>

<Document>
  <properties>
    <property name="daily.backup.filename">test.data.thin</property>
    <property name="admin.ui.allow.manual.backup.download">false</property>
    <property name="admin.ui.allow">false</property>
  </properties>
</Document>
  

Этот конфигурационный файл будет иметь более 50 свойств с разными именами. Моя цель — настроить данные в пределах этого единственного свойства без использования модуля lineinfile.

В настоящее время я могу прочитать конкретное значение, которое мне нужно, но значение изменится, если порядок изменится.

 - hosts: localhost

  tasks:
  - name: Read an element's attribute values
    xml:
      path: /tmp/test.xml
      xpath: /Document/properties/property
      content: text
    register: xmlresp

  - name: Show an attribute value
    debug:
      var: xmlresp.matches[2]
  

Теперь мне просто нужно иметь возможность записывать новую информацию для «admin.ui.allow.manual.backup.загрузить» свойство. Например, изменить содержимое на «true» или «True»

Ответ №1:

Чтобы получить значение внутри вашего конкретного элемента, вы можете быть намного более строгими в своем xpath:

   - name: "Read an element's attribute values"
    xml:
      path: /tmp/test.xml
      xpath: /Document/properties/property[@name='admin.ui.allow.manual.backup.download']
      content: text
    register: xmlresp
  

Аналогично, вы можете использовать тот же самый более строгий (одноэлементный) xpath для обновления содержимого вашего элемента, если это необходимо:

   - name: Update element value if needed
    xml:
      path: /tmp/test.xml
      xpath: /Document/properties/property[@name='admin.ui.allow.manual.backup.download']
      value: "true"
  

Комментарии:

1. Еще раз на помощь. Я бы хотел, чтобы документация ( docs.ansible.com/ansible/latest/modules /… ) в модуле XML было это в качестве примера.

2. Вы можете найти примеры такого типа в любом документе / руководстве по xpath.