Ansible - Advanced shell exécution de la commande format
J'ai 3 variables nommées IPOctet, ServerIPRange et epcrange.
Si j'effectue l'opération suivante dans mon terminal, il fonctionne parfaitement
IPOctet=$(echo "$ServerIPRange/$epcrange+$IPOctet" | bc)
Comment puis-je faire quelque chose de similaire dans un ansible l'intérieur d'une tâche, pour l'e.g
---
- hosts: localhost
gather_facts: False
vars_prompt:
- name: epcrange
prompt: Enter the number of EPCs that you want to configure
private: False
default: "1"
- name: serverrange
prompt: Enter the number of Clients that you want to configure
private: False
default: "1"
- name: ServerIPRange
prompt: Enter the ServerIP range
private: False
default: '128'
- name: LastIPOctet
prompt: Enter The last Octet of the IP you just entered
private: False
default: '10'
pre_tasks:
- name: Set some facts
set_fact:
ServerIP1: "{{ServerIP}}"
ServerIPRange1: "{{ServerIPRange}}"
IPOctet: "{{LastIPOctet}}"
- name: local action math
local_action: shell {{IPOctet}}=$(echo "${{ServerIPRange}}/${{epcrange}}+${{IPOctet}}" | bc) # Proper Syntax?
with_sequence: start=1 end=4
register: result
ignore_errors: yes
Quelle est la bonne syntaxe de cette commande? Peut-être que l'utilisation de shell echo "......." . J'ai juste besoin d'enregistrer le contenu de cette commande dans le IPOctet variable et IPOctet change à chaque itération de boucle, et les résultats devraient être stockés dans mon résultat registre
P. S: comment puis-je accéder à chacun des éléments dans le tableau séparément?
Edit: c'Est quelque chose comme cela possible, actuellement, il a juste fait le calcul une fois et la stocke 4 fois dans le registre...
- name: bashless math
set_fact:
IPOctet: "{{ (ServerIPRange|int/epcrange|int)+IPOctet|int }}"
register: IPOctet
with_sequence: "start=1 end={{stop}} "
register: my_ip_octet
OriginalL'auteur Khan | 2014-08-21
Vous devez vous connecter pour publier un commentaire.
Votre terminal expression réassigne le IPOctet variable shell, donc ça donne un résultat différent à chaque fois qu'elle est exécutée. C'est bien, mais difficile à reproduire dans Ansible:
La syntaxe:
"shell {{IPOctet}}=$(echo ..."
ne PAS céder à l'Ansible variable.Le shell tente d'exécuter une commande comme
"10=138"
, ce qui n'est pas trouvé.Lorsque le registre est utilisé dans une boucle, la variable cible n'est pas défini jusqu'à ce que la boucle de la - de sorte que votre expression voit toujours la valeur d'origine pour
{{IPOctet}}
.Une solution consiste à exécuter la totalité de la boucle comme une seule commande shell:
REMARQUE: j'ai utilisé le
expr
de commande plutôt que debc
, mais le résultat est le même.Vous pouvez parcourir ces résultats à l'aide de résultat.stdout_lines:
Puis-je avoir une boucle comme ceci for i in range(0,{{IPOctet}},{{ 2**{{x}} }}) où x est une variable définie quelque part dans vars_prompt.
Oui, vous pouvez utiliser le bash arithmétique pour la boucle (note doubles parenthèses): for ((i=0; i<128; i+=2**4)); do echo $i; done
OriginalL'auteur Derek Baum
Tout d'abord votre Jinja modèle est incorrect, chaque variable doit être entourée d'une paire de crochets. Vous ne pouvez pas utiliser plusieurs variables dans une seule paire de crochets. Par exemple,
Deuxièmement, set_fact est uniquement utilisé pour définir un effet de la valeur. Vous ne pouvez pas exécuter des commandes shell à l'aide de set_fact. Vous devez utiliser le shell module à la place.
Ansible fera le calcul 4 fois et de les stocker dans une liste de 4 éléments différents. Vous pouvez vérifier ce que tout est stocké à l'intérieur de cette liste et peut même y accéder en faisant une boucle sur elle.
Espère que cela aide 🙂
OriginalL'auteur Ramesh Raithatha