Dans Ansible (1.9.4) ou 2.0.0
J'ai couru l'action suivante:
- debug: msg="line1 \n {{ var2 }} \n line3 with var3 = {{ var3 }}"
$ rôles de chat/setup_jenkins_slave/tasks/main.yml
- debug: msg="Installing swarm slave = {{ slave_name }} at {{ slaves_dir }}/{{ slave_name }}"
tags:
- koba
- debug: msg="1 == Slave properties = fsroot[ {{ slave_fsroot }} ], master[ {{ slave_master }} ], connectingToMasterAs[ {{ slave_user }} ], description[ {{ slave_desc }} ], No.Of.Executors[ {{ slave_execs }} ], LABELs[ {{ slave_labels }} ], mode[ {{ slave_mode }} ]"
tags:
- koba
- debug: msg="print(2 == Slave properties = \n\nfsroot[ {{ slave_fsroot }} ],\n master[ {{ slave_master }} ],\n connectingToMasterAs[ {{ slave_user }} ],\n description[ {{ slave_desc }} ],\n No.Of.Executors[ {{ slave_execs }} ],\n LABELs[ {{ slave_labels }} ],\n mode[ {{ slave_mode }} ])"
tags:
- koba
Mais ceci n’imprime-t-il pas la variable avec de nouvelles lignes (pour la 3ème action de débogage)?
Pour résoudre ce problème, j'ai utilisé with_items et cela a fonctionné pour moi.
- debug: msg="Installing swarm slave = {{ slave_name }} at {{ slaves_dir }}/{{ slave_name }}"
- debug: msg="Slave properties = {{ item.prop }} [ {{ item.value }} ]"
with_items:
- { prop: 'fsroot', value: "{{ slave_fsroot }}" }
- { prop: 'master', value: "{{ slave_master }}" }
- { prop: 'connectingToMasterAs', value: "{{ slave_user }}" }
- { prop: 'description', value: "{{ slave_desc }}" }
- { prop: 'No.Of.Executors', value: "{{ slave_execs }}" }
- { prop: 'LABELs', value: "{{ slave_labels }}" }
- { prop: 'mode', value: "{{ slave_mode }}" }
tags:
- koba
le module de débogage supporte tableau, vous pouvez donc faire comme ceci:
debug:
msg:
- "First line"
- "Second line"
Le résultat:
ok: [node1] => {
"msg": [
"First line",
"Second line"
]
}
Ou vous pouvez utiliser la méthode de cette réponse:
Le moyen le plus pratique que j'ai trouvé d'imprimer du texte multiligne avec le débogage est le suivant:
- name: Print several lines of text
vars:
msg: |
This is the first line.
This is the second line with a variable like {{ inventory_hostname }}.
And here could be more...
debug:
msg: "{{ msg.split('\n') }}"
Il divise le message en un tableau et le débogage imprime chaque ligne sous forme de chaîne. La sortie est:
ok: [example.com] => {
"msg": [
"This is the first line.",
"This is the second line with a variable like example.com",
"And here could be more...",
""
]
}
Merci à jhutar .
apt
avec [:-1]
---
- name: 'apt: update & upgrade'
apt:
update_cache: yes
cache_valid_time: 3600
upgrade: safe
register: apt
- debug: msg={{ apt.stdout.split('\n')[:-1] }}
La ligne debug:
Ci-dessus entraîne des sauts de ligne Nice, dus à .split('\n')
, et une dernière chaîne vide supprimée grâce à [:-1]
; tout ce qui est Python manipulation de chaîne, bien sûr.
"msg": [
"Reading package lists...",
"Building dependency tree...",
"Reading state information...",
"Reading extended state information...",
"Initializing package states...",
"Building tag database...",
"No packages will be installed, upgraded, or removed.",
"0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.",
"Need to get 0 B of archives. After unpacking 0 B will be used.",
"Reading package lists...",
"Building dependency tree...",
"Reading state information...",
"Reading extended state information...",
"Initializing package states...",
"Building tag database..."
]
Je digère un peu sur la réponse de @Bruce P à propos de la sortie de tuyauterie via sed, et voici ce que je suis arrivé à faire:
ansible-playbook [blablabla] | sed 's/\\n/\n/g'
si quelqu'un est intéressé.
C'est discuté ici . En bref, vous devez soit acheminer votre sortie via sed pour convertir le \n
vers une nouvelle ligne réelle, ou vous devez écrire un plug-in de rappel pour le faire à votre place.
Vous pouvez utiliser stdout_lines
de la variable de registre:
- name: Do something
Shell: "ps aux"
register: result
- debug: var=result.stdout_lines
Le moyen le plus simple et le plus simple que j’ai trouvé d’afficher un message avec le formatage (ex: nouvelles lignes, onglets ...) consiste à utiliser le module " pause " au lieu du module "débogage":
- pause:
seconds: 1
Prompt: |
======================
line_1
line_2
======================
Vous pouvez également inclure une variable contenant une mise en forme (nouvelles lignes, onglets ...) dans l'invite et elle sera affichée comme prévu:
- name: test
hosts: all
vars:
line3: "\n line_3"
tasks:
- pause:
seconds: 1
Prompt: |
/////////////////
line_1
line_2 {{ line3 }}
/////////////////
-
lorsque vous souhaitez afficher une sortie d'une commande et que, au lieu d'exécuter une tâche supplémentaire pour exécuter la commande et enregistrer la sortie, vous pouvez directement utiliser la recherche de canal dans l'invite et effectuer le travail en une fois:
- pause:
seconds: 1
Prompt: |
=========================
line_1
{{ lookup('pipe', 'echo "line_2 with \t tab \n line_3 "') }}
line_4
=========================
-
Si vous avez plusieurs hôtes, sachez que la tâche "pause" ne sera exécutée qu'une seule fois par rapport au premier hôte de la liste des hôtes.
Cela signifie que si la variable que vous souhaitez afficher n'existe que dans une partie des hôtes et que le premier hôte ne contient pas cette variable, vous obtiendrez une erreur.
Pour éviter un tel problème, utilisez {{hostvars ['my_Host'] ['my_var']}} au lieu de {{my_var}}
La combinaison de "pause" avec "quand" conditionnel peut sauter la tâche !, pourquoi? Parce que la tâche ne sera exécutée qu’une fois contre le premier hôte, qui pourrait ne pas être conforme aux conditions énoncées "quand".
Pour éviter cela, n'utilisez pas de conditions qui limitent le nombre d'hôtes! comme vous n'en avez pas besoin non plus, parce que vous savez que la tâche ne sera exécutée qu'une seule fois, utilisez également hostvars comme indiqué ci-dessus pour vous assurer d'obtenir la variable nécessaire, quel que soit l'hôte pris en charge.
Exemple:
Incorrect:
- name: test
hosts: Host1,Host2
vars:
display_my_var: true
tasks:
- when: inventory_hostname == 'Host2'
set_fact:
my_var: "hi there"
- when:
- display_my_var|bool
- inventory_hostname == 'Host2'
pause:
seconds: 1
Prompt: |
{{ my_var }}
Cet exemple ignorera la tâche de pause, car il choisira uniquement le premier hôte "Host1", puis commencera à évaluer les conditions. Lorsqu'il trouvera que "Host1" ne se conforme pas à la deuxième condition, il ignorera la tâche.
Correct:
- name: test
hosts: Host1,Host2
vars:
display_my_var: true
tasks:
- when: inventory_hostname == 'Host2'
set_fact:
my_var: "hi there"
- when: display_my_var|bool
pause:
seconds: 1
Prompt: |
{{ hostvars['Host2']['my_var'] }}
Un autre exemple d'affichage de messages dont le contenu dépend de l'hôte:
- set_fact:
my_var: "hi from {{ inventory_hostname }}"
- pause:
seconds: 1
Prompt: |
{% for Host in ansible_play_hosts %}
{{ hostvars[Host]['my_var'] }}
{% endfor %}
J'ai eu un problème similaire avec le fichier journal que je voulais imprimer sur la console. split("\n")
fonctionne bien mais ajoute visible \n
à chaque ligne, j'ai donc trouvé un moyen plus agréable
tasks:
- name: Read recent lines from logfile for service {{ appName }}
Shell: tail -n 1000 {{ logFile }}
register: appNameLogFile
- debug:
msg: "This is a stdout lines"
with_items: "{{ appNameLogFile.stdout }}"
Il effectue une itération sur chaque ligne de appNameLogFile
et, à mesure que l'effet secondaire imprime cette ligne dans la console. Vous pouvez le mettre à jour pour
msg: "This is a stdout lines: {{ item }}"
mais dans mon cas il n'était pas nécessaire