Ansible – Bericht afdrukken – debug: msg=”line1 \n {{ var2 }} \n line3 with var3 = {{ var3 }}”

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 pausemodule in plaats van debugmodule:

   - 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:

  1. Als je meerdere hosts hebt, houd er dan rekening mee dat de taak pausewordt 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 }}

  2. Het combineren van pausemet whenvoorwaardelijk kan de taak overslaan! Waarom?
    Omdat de taak maar één keer wordt uitgevoerd tegen de eerste host die
    voldoet mogelijk niet aan de vermelde when-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 vermelde hostvarsom 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 host1kiest en vervolgens de voorwaarden begint te evalueren, wanneer wordt vastgesteld dat host1niet 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 aptonderdrukken 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_linesvan 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 \nnaar 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 \ntoe 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 appNameLogFileen 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

Other episodes