it-swarm.com.de

Ansible - Print message - debug: msg = "Zeile1 \ n {{var2}} \ n Zeile3 mit var3 = {{var3}}"

In Ansible (1.9.4) oder 2.0.0

Ich habe folgende Aktion ausgeführt:

- debug: msg="line1 \n {{ var2 }} \n line3 with var3 = {{ var3 }}"

$ cat role/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

Aber das ist nicht Drucken der Variablen mit neuen Zeilen (für die 3. Debug-Aktion)?

42
Arun Sangal

Als Workaround habe ich with_items verwendet und es hat irgendwie bei mir funktioniert.

- 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
0
Arun Sangal

debug-Modul Support-Array, so können Sie dies tun:

debug:
  msg:
    - "First line"
    - "Second line"

Die Ausgabe:

ok: [node1] => {
    "msg": [
        "First line",
        "Second line"
    ]
}

Oder Sie können die Methode aus dieser Antwort verwenden:

Wie kann ich in YAML einen String über mehrere Zeilen aufteilen?

53
diabloneo

Der bequemste Weg, mehrzeiligen Text mit Debug zu drucken, ist:

- 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') }}"

Es teilt die Nachricht in ein Array auf und gibt jede Zeile als String aus. Die Ausgabe ist:

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...", 
        ""
    ]
}

Danke an jhutar .

45
maikel

Unterdrücken der letzten leeren Zeichenfolge von apt mit [:-1]

---
- name: 'apt: update & upgrade'
  apt:
    update_cache: yes
    cache_valid_time: 3600
    upgrade: safe
  register: apt
- debug: msg={{ apt.stdout.split('\n')[:-1] }}

Die obige debug: - Zeile führt zu netten Zeilenumbrüchen aufgrund von .split('\n') und einer unterdrückten letzten leeren Zeichenfolge dank [:-1]; Das alles ist natürlich Python String-Manipulation.

"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..."
]
4

Ich habe mich ein wenig mit der Antwort von @Bruce P über das Leiten der Ausgabe durch sed befasst, und darauf bin ich gekommen:

ansible-playbook [blablabla] | sed 's/\\n/\n/g'

wenn jemand interessiert ist.

2
edelans

Dies ist hier diskutiert . Kurz gesagt, Sie müssen entweder Ihre Ausgabe durch sed leiten, um das \n an eine aktuelle Newline, oder Sie müssen ein Callback-Plugin schreiben, um dies für Sie zu tun.

1
Bruce P

Du könntest benutzen stdout_lines der Registervariable:

- name: Do something
  Shell: "ps aux"
  register: result

- debug: var=result.stdout_lines
0
Eugene Lopatkin

Modul anhalten:

Die bequemste und einfachste Möglichkeit, eine Nachricht mit Formatierung anzuzeigen (z. B. neue Zeilen, Tabulatoren ...), ist die Verwendung des Moduls " pause " anstelle des Moduls "debug":

    - pause:
        seconds: 1
        Prompt: |
          ======================
            line_1
            line_2
          ======================

Sie können auch eine Variable in die Eingabeaufforderung einfügen, die Formatierungen (neue Zeilen, Tabulatoren ...) enthält. Diese werden wie erwartet angezeigt:

- name: test
  hosts: all
  vars:
    line3: "\n  line_3"
  tasks:
    - pause:
        seconds: 1
        Prompt: |
          /////////////////
            line_1
            line_2 {{ line3 }}
          /////////////////

-

Spitze:

wenn Sie eine Ausgabe eines Befehls anzeigen möchten und statt einer zusätzlichen Task zum Ausführen des Befehls und Registrieren der Ausgabe, können Sie die Pipe-Suche direkt in der Eingabeaufforderung verwenden und die Aufgabe auf einmal ausführen:

    - pause:
        seconds: 1
        Prompt: |
          =========================
            line_1
            {{ lookup('pipe', 'echo "line_2 with \t tab \n  line_3 "') }}
            line_4
          =========================

-

Zusätzliche Hinweise zum Pausenmodul:

  1. Wenn Sie mehrere Hosts haben, beachten Sie, dass die Aufgabe "Pause" nur einmal für den ersten Host in der Liste der Hosts ausgeführt wird.

    Dies bedeutet, dass Sie eine Fehlermeldung erhalten, wenn die anzuzeigende Variable nur in einem Teil der Hosts vorhanden ist und der erste Host diese Variable nicht enthält.

    Verwenden Sie {{hostvars ['my_Host'] ['my_var']} anstelle von {{my_var}}, um ein solches Problem zu vermeiden.

  2. Wenn Sie "Pause" mit "Wann" als Bedingung kombinieren, wird die Aufgabe möglicherweise übersprungen! Warum? Weil die Task nur einmal auf dem ersten Host ausgeführt wird, der möglicherweise nicht den angegebenen "Wann" -Bedingungen entspricht.

    Um dies zu vermeiden, verwenden Sie keine Bedingungen, die die Anzahl der Hosts einschränken! Da Sie es auch nicht benötigen, weil Sie wissen, dass die Aufgabe sowieso nur einmal ausgeführt wird, sollten Sie auch die oben angegebenen Hostvars verwenden, um sicherzustellen, dass Sie die benötigte Variable erhalten, unabhängig davon, um welchen Host es sich handelt.

Beispiel:

Falsch:

- 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 diesem Beispiel wird die Pausenaufgabe übersprungen, da nur der erste Host "Host1" ausgewählt wird. Anschließend werden die Bedingungen ausgewertet, wenn festgestellt wird, dass "Host1" nicht der zweiten Bedingung entspricht. Die Aufgabe wird übersprungen.

Richtig:

- 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'] }}

Ein weiteres Beispiel zum Anzeigen von Nachrichten, bei denen der Inhalt vom Host abhängt:

    - set_fact:
        my_var: "hi from {{ inventory_hostname }}"
    - pause:
        seconds: 1
        Prompt: |
          {% for Host in ansible_play_hosts %}
            {{ hostvars[Host]['my_var'] }}
          {% endfor %}
0
Ejez

Ich hatte ein ähnliches Problem mit der Protokolldatei, die ich auf die Konsole drucken wollte. split("\n") funktioniert gut, fügt aber zu jeder Zeile sichtbares \n hinzu, sodass ich einen besseren Weg gefunden habe

  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 }}"

Es durchläuft jede Zeile von appNameLogFile und druckt diese Zeile als Nebeneffekt in die Konsole. Sie können es aktualisieren

        msg: "This is a stdout lines: {{ item }}"

aber in meinem Fall wurde es nicht benötigt

0
Damian