1
votes

Analyser une liste de plusieurs adresses IP en variables individuelles

Est-il possible d'analyser une sortie que je tire de stdout.

10.1.1.1
10.2.2.2
10.3.3.3

cela produit la sortie d'une liste d'adresses IP à partir de ma commande d'origine.

name: PARSE ALL IP's
set fact: parsedbgpIPs="BGPOUTPUT.stdout[0] | regex_findall('\\b(?:[0-9]{1,3}\\.){3}[0-9]{1,3}\\b') }}"

Ma question est de savoir comment séparer la sortie en 3 adresses IP, chacune stockée sous forme de variable individuelle?


5 commentaires

mystring.split () ? Si la sortie est déjà une liste, ils sont déjà séparés


Publiez "debug: var = BGPOUTPUT" pour voir les options.


Ceci fonctionne dans ansible donc la sortie est légèrement différente


TÂCHE [débogage] ************************************************ ************** ‌ ******************** ‌ ************ ******** ‌ ******************** ‌ *********** ok: [Router01] => msg: | - Liste des IP - 10.1.1.1 - 10.2.2.2 - 10.3.3.3


- debug: msg: "Liste des adresses IP {{parsedbgpIPs | to_nice_yaml}}"


3 Réponses :


2
votes

Q: Comment séparer la sortie en 3 adresses IP stockées chacune comme une variable individuelle?

R: Il est possible de créer un dictionnaire personnalisé et d'y créer dynamiquement les variables. Par exemple, le jeu ci-dessous

loop: "{{  BGPOUTPUT.stdout[0] | regex_findall('\\b(?:[0-9]{1,3}\\.){3}[0-9]{1,3}\\b') }}"

donne

"my_vars": {
    "IP_0": "10.1.1.1", 
    "IP_1": "10.2.2.2", 
    "IP_2": "10.3.3.3"
}

"my_vars.IP_1": "10.2.2.2"

Dans votre cas, il est possible d'itérer la liste des IP. Remplacez loop: "{{my_ip_list}}" dans la lecture ci-dessus par la ligne suivante

  vars:
    my_vars: {}
    my_ip_list:
      - 10.1.1.1
      - 10.2.2.2
      - 10.3.3.3
  tasks:
    - set_fact:
        my_vars: "{{ my_vars|combine({'IP_' ~ my_idx : item}) }}"
      loop: "{{ my_ip_list }}"
      loop_control:
        index_var: my_idx
    - debug:
        var: my_vars
    - debug:
        var: my_vars.IP_1

1 commentaires

Merci beaucoup, avec une tête fraîche, cela fonctionne ce matin. Merci beaucoup



1
votes

Si vous stockez le résultat de votre script dans une variable bash, alors vous pouvez remplir un tableau ligne par ligne, avec cette syntaxe

echo "${IPLIST[0]}"
10.1.1.1

echo "${IPLIST[1]}"
10.2.2.2

Vous pouvez maintenant accéder aux éléments du tableau nouvellement créé par index

declare -a IPLIST           # optional but nice
IPLIST=($RESULTOFSCRIPT)    # RESULTOFSCRIPT contains the output of your script


0 commentaires

0
votes

Une solution serait d'analyser la sortie dans un fichier texte, puis de lire le fichier en boucle et de l'utiliser comme valeur de la variable. Voici un exemple:

name: PARSE ALL IP's
set fact: parsedbgpIPs="BGPOUTPUT.stdout[0] | regex_findall('\\b(?:[0-9]{1,3}\\.){3}[0-9]{1,3}\\b') }}" > iplist.txt
for ip in $(cat iplist.txt)
do 
   ... (your code)
done


0 commentaires