Чтение XML Xpath, только если xpath определен в Ansible - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь выполнить задачу ansible чтения xpath из xml, только если xpath присутствует

  - Read xml
    xml:
       path: /home/myuser/myfile.xml
       xpath: /component/releases/release[@version='1.3']/scripts/script
       content: attribute
       attribute: path
    register: scriptVal

и мой xml выглядит так

<?xml version="1.0" encoding="UTF-8"?>
<component name="anthony_db" ....... >
  <releases>
    <release version="1.2">
      <scripts>
        <script path="/path/to/scripts/sql1" />
        <script path="/path/to/scripts/sql2" />
      </scripts>
    </release>
    <release version="1.3">
      <scripts> 
      </scripts>
    </release>
  </releases>
</component>

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

1 Ответ

1 голос
/ 07 мая 2020

Одним из решений может быть использование конструкции блок / спасение для обработки случая, когда задача не выполняется. Вот PO C, вы можете поиграть, изменив версию, чтобы увидеть результат:

---
- hosts: localhost
  gather_facts: false

  vars_prompt:
    - name: version
      prompt: "Version ?"
      default: "1.2"
      private: no

  vars:
    xml: |-
      <?xml version="1.0" encoding="UTF-8"?>
      <component name="anthony_db">
        <releases>
          <release version="1.2">
            <scripts>
              <script path="/path/to/scripts/sql1" />
              <script path="/path/to/scripts/sql2" />
            </scripts>
          </release>
          <release version="1.3">
            <scripts>
            </scripts>
          </release>
        </releases>
      </component>

  tasks:
    - block:

        - name: Read xml
          xml:
            xmlstring: "{{ xml }}"
            xpath: "/component/releases/release[@version='{{ version }}']/scripts/script"
            content: attribute
          register: scriptVal

      rescue:

        - debug:
            msg: "There is no script for version {{ version }}"

        - set_fact:
            scriptVal: "I have no value"

    - name: Show value of scriptVal
      debug:
        var: scriptVal
...