web-dev-qa-db-fra.com

Ansible - Message d'impression - debug: msg = "line1 \ n {{var2}} \ n line3 avec var3 = {{var3}}"

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)?

42
Arun Sangal

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

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:

En YAML, comment briser une chaîne sur plusieurs lignes?

53
diabloneo

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 .

45
maikel

Supprimer la dernière chaîne vide de 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..."
]
4
Serge Stroobandt

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é.

2
edelans

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.

1
Bruce P

Vous pouvez utiliser stdout_lines de la variable de registre:

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

- debug: var=result.stdout_lines
0
Eugene Lopatkin

Module de pause:

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

-

Pointe:

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

-

Notes supplémentaires concernant le module de pause:

  1. 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}}

  2. 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 %}
0
Ejez

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

0
Damian