In Ansible (1.9.4) of 2.0.0
Ik heb de volgende actie uitgevoerd:
- debug: msg="line1 \n {{ var2 }} \n line3 with var3 = {{ var3 }}"
$ kattenrollen/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
Maar dit drukt de variabele niet af met nieuwe regels (voor de 3e foutopsporingsactie)?
Antwoord 1, autoriteit 100%
debug module ondersteuning array, dus je kunt het als volgt doen:
debug:
msg:
- "First line"
- "Second line"
De uitvoer:
ok: [node1] => {
"msg": [
"First line",
"Second line"
]
}
Of je kunt de methode uit dit antwoord gebruiken:
Hoe breek ik in YAML een string over meerdere regels?
Antwoord 2, autoriteit 72%
De handigste manier die ik heb gevonden om tekst met meerdere regels af te drukken met foutopsporing is:
- 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') }}"
Het splitst het bericht op in een array en debug drukt elke regel af als een string. De uitvoer is:
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...",
""
]
}
Met dank aan jhutar.
Antwoord 3, autoriteit 24%
Pauzemodule:
De handigste en eenvoudigste manier die ik heb gevonden om een bericht met opmaak weer te geven (bijvoorbeeld: nieuwe regels, tabbladen …) is door de pause
module in plaats van debug
module:
- pause:
seconds: 1
prompt: |
======================
line_1
line_2
======================
U kunt ook een variabele opnemen die opmaak bevat (nieuwe regels, tabbladen…) in de prompt en deze wordt weergegeven zoals verwacht:
- name: test
hosts: all
vars:
line3: "\n line_3"
tasks:
- pause:
seconds: 1
prompt: |
/////////////////
line_1
line_2 {{ line3 }}
/////////////////
Tip:
wanneer u een uitvoer van een opdracht wilt weergeven en in plaats van een extra taak uit te voeren om de opdracht uit te voeren en de uitvoer te registreren, kunt u direct de pipe-lookup in de prompt gebruiken en de klus in één keer klaren:
p>
- pause:
seconds: 1
prompt: |
=========================
line_1
{{ lookup('pipe', 'echo "line_2 with \t tab \n line_3 "') }}
line_4
=========================
Extra opmerkingen over de pauzemodule:
-
Als je meerdere hosts hebt, houd er dan rekening mee dat de taak
pause
wordt uitgevoerd
slechts één keer tegen de eerste host in de lijst met hosts.Dit betekent dat als de variabele die u wilt weergeven alleen bestaat in
een deel van de hosts en de eerste host bevat die variabele niet
dan krijg je een foutmelding.Om een dergelijk probleem te voorkomen, gebruikt u
{{ hostvars['my_host']['my_var'] }}
in plaats van{{ my_var }}
-
Het combineren van
pause
metwhen
voorwaardelijk kan de taak overslaan! Waarom?
Omdat de taak maar één keer wordt uitgevoerd tegen de eerste host die
voldoet mogelijk niet aan de vermeldewhen
-voorwaarden.Gebruik om dit te voorkomen geen voorwaarden die het aantal
gastheren! Omdat je het ook niet nodig hebt, omdat je weet dat de taak zal
toch maar één keer draaien. Gebruik ook de hierboven vermeldehostvars
om er zeker van te zijn
je krijgt de benodigde variabele, wat de opgepikte host ook is.
Voorbeeld:
Onjuist:
- 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 }}
In dit voorbeeld wordt de pauzetaak overgeslagen, omdat het alleen de eerste host host1
kiest en vervolgens de voorwaarden begint te evalueren, wanneer wordt vastgesteld dat host1
niet voldoet aan de tweede voorwaarde zal de taak overslaan.
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'] }}
Nog een voorbeeld om berichten weer te geven waarvan de inhoud afhangt van de host:
- set_fact:
my_var: "hi from {{ inventory_hostname }}"
- pause:
seconds: 1
prompt: |
{% for host in ansible_play_hosts %}
{{ hostvars[host]['my_var'] }}
{% endfor %}
Antwoord 4, autoriteit 9%
De laatste lege string van apt
onderdrukken met [:-1]
---
- name: 'apt: update & upgrade'
apt:
update_cache: yes
cache_valid_time: 3600
upgrade: safe
register: apt
- debug: msg={{ apt.stdout.split('\n')[:-1] }}
De bovenstaande debug:
regel resulteert in mooie regeleinden, dankzij .split('\n')
, en een onderdrukte laatste lege string dankzij [:-1]
; dat is natuurlijk allemaal Python-stringmanipulatie.
"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..."
]
Antwoord 5, autoriteit 8%
Je zou stdout_lines
van registervariabele kunnen gebruiken:
- name: Do something
shell: "ps aux"
register: result
- debug: var=result.stdout_lines
Antwoord 6, autoriteit 6%
Ik graaf een beetje op het antwoord van @Bruce P over de output van buizen door sed, en dit is waar ik op uitkwam:
ansible-playbook [blablabla] | sed 's/\\n/\n/g'
als iemand geïnteresseerd is.
Antwoord 7, autoriteit 2%
Dit wordt hier besproken. Kortom, je moet ofwel je output door sed sturen om de \n
naar een echte nieuwe regel te converteren, of je moet een callback-plug-in schrijven om dit voor je te doen.
Antwoord 8
Als tijdelijke oplossing gebruikte ik with_itemsen het werkte voor mij.
- 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
Antwoord 9
Ik had een soortgelijk probleem met het logbestand dat ik naar de console wilde afdrukken. split("\n")
werkt prima, maar het voegt zichtbare \n
toe aan elke regel, dus ik vond een leukere manier
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 }}"
Het herhaalt elke regel van appNameLogFile
en als bijwerking wordt deze regel in de console afgedrukt. Je kunt het updaten naar
msg: "This is a stdout lines: {{ item }}"
maar in mijn geval was het niet nodig