es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Extraer múltiples valores de una cadena en Ansible.

Soy un traductor español que traduce documentos de IT. Traduzca lo siguiente al español. No traduzca el código y la salida en Markdown.

Soy principiante en Ansible, tengo una cadena en el siguiente formato:

str = "

<p>aaaa.abc1=value1</p>

<p>aaaa.abc2=</p>

<p>aaaa.def1=value2</p>

<p>aaaa.ddd1=</p>

<p>";

Los espacios entre la cadena son básicamente una línea en blanco.

Estoy intentando extraer los siguientes valores en 2 listas separadas:

list1=['abc1','def1']
list2=['value1','value2']

¿Cómo puedo lograrlo?
¡Gracias de antemano!

Tags:  

Answer

  1. Avatar for davy.ai

    Para lograr esto, puedes utilizar las siguientes tareas de Ansible:

    1. Usa el método splitlines() para dividir el string por líneas y almacenar el resultado en una variable de lista:
    - name: Dividir el string por líneas
      set_fact:
        lines: "{{ str.splitlines() }}"
    
    1. Usa un ciclo para iterar a través de cada línea y dividirla por el signo igual (=) para separar las claves y los valores:
    - name: Extraer claves y valores de las líneas
      set_fact:
        keys: "{{ keys|default([]) + [item.split('.')[1]] }}"
        values: "{{ values|default([]) + [item.split('=')[1]] }}"
      loop: "{{ lines }}"
      when: item | regex_search('.*[a-z]*\.[a-z]*=.*')
    
    1. Filtra las listas resultantes para eliminar cualquier valor vacío:
    - name: Eliminar valores vacíos de las claves y los valores
      set_fact:
        keys: "{{ keys|select('match', '.+')}}"
        values: "{{ values|select('match', '.+')}}"
    
    1. Asigna las listas resultantes a las variables list1 y list2:
    - name: Asignar las listas resultantes a las variables
      set_fact:
        list1: "{{ keys }}"
        list2: "{{ values }}"
    

    El playbook final se vería así:

    - hosts: all
      vars:
        str: |
          aaaa.abc1=value1
    
          aaaa.abc2=
    
          aaaa.def1=value2
    
          aaaa.ddd1=
      tasks:
        - name: Dividir el string por líneas
          set_fact:
            lines: "{{ str.splitlines() }}"
    
        - name: Extraer claves y valores de las líneas
          set_fact:
            keys: "{{ keys|default([]) + [item.split('.')[1]] }}"
            values: "{{ values|default([]) + [item.split('=')[1]] }}"
          loop: "{{ lines }}"
          when: item | regex_search('.*[a-z]*\.[a-z]*=.*')
    
        - name: Eliminar valores vacíos de las claves y los valores
          set_fact:
            keys: "{{ keys|select('match', '.+')}}"
            values: "{{ values|select('match', '.+')}}"
    
        - name: Asignar las listas resultantes a las variables
          set_fact:
            list1: "{{ keys }}"
            list2: "{{ values }}"
    
        - name: Imprimir las listas resultantes
          debug:
            var:
              - list1
              - list2
    

    ¡Espero que esto ayude!

Comments are closed.