it-swarm.com.ru

Ansible - печать сообщения - отладка: msg = "line1 \ n {{var2}} \ n line3 с var3 = {{var3}}"

В Ansible (1.9.4) или 2.0.0

Я выполнил следующее действие:

- 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

Но это не печать переменной с новыми строками (для 3-го действия отладки)?

42
Arun Sangal

В качестве обходного пути я использовал with_items, и это отчасти сработало для меня.

- 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:
  msg:
    - "First line"
    - "Second line"

Результат:

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

Или вы можете использовать метод из этого ответа:

В YAML как разбить строку на несколько строк?

53
diabloneo

Я нашел наиболее удобный способ печати многострочного текста с помощью отладки:

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

Он разбивает сообщение на массив и отлаживает вывод каждой строки в виде строки. Выход:

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

Благодаря Джутар .

45
maikel

Подавление последней пустой строки apt с помощью _[:-1]_

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

Приведенная выше строка _debug:_ приводит к разрывам строки Nice из-за .split('\n') и ​​подавленной последней пустой строке благодаря _[:-1]_; все это Python манипулирование строками, конечно.

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

Я немного покопался в ответе @Bruce P о передаче данных через sed, и вот к чему я пришел:

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

если кому-то интересно.

2
edelans

Это обсуждается здесь . Короче говоря, вам нужно либо передать вывод через sed для преобразования \n к фактической новой строке, или вам нужно написать плагин обратного вызова, чтобы сделать это для вас.

1
Bruce P

Вы могли бы использовать stdout_lines регистровой переменной:

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

- debug: var=result.stdout_lines
0
Eugene Lopatkin

Модуль паузы:

Наиболее удобный и простой способ отображения сообщения с форматированием (например, новые строки, вкладки ...) - это использование модуля " pause " вместо модуля "debug":

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

Вы также можете включить переменную, которая содержит форматирование (новые строки, табуляции ...) внутри подсказки, и она будет отображаться как ожидается:

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

-

Чаевые:

когда вы хотите отобразить вывод команды и вместо выполнения дополнительной задачи для ее запуска и регистрации вывода, вы можете напрямую использовать поиск канала внутри подсказки и выполнить задание за один раз:

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

-

Дополнительные примечания относительно модуля паузы:

  1. Если у вас несколько хостов, помните, что задача "пауза" будет запущена только один раз против первого хоста в списке хостов.

    Это означает, что если переменная, которую вы хотите отобразить, существует только в части хостов, а первый хост не содержит эту переменную, то вы получите ошибку.

    Чтобы избежать такой проблемы, используйте {{hostvars ['my_Host'] ['my_var']}} вместо {{my_var}}

  2. Сочетание "пауза" с "когда" условно может пропустить задачу! Почему? Потому что задача будет выполняться только один раз против первого хоста, который может не соответствовать указанным условиям "когда".

    Чтобы избежать этого, не используйте условия, которые ограничивают количество хостов! поскольку вам это тоже не нужно, потому что вы знаете, что задача все равно будет запускаться только один раз, также используйте hostvars, указанные выше, чтобы убедиться, что вы получите необходимую переменную, какой бы ни был выбранный хост.

Пример:

Неправильно:

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

В этом примере будет пропущена задача паузы, поскольку он выберет только первый хост "Host1", а затем начнет оценивать условия, когда он обнаружит, что "Host1" не соответствует второму условию, он пропустит задачу.

Правильный:

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

Еще один пример отображения сообщений, содержимое которых зависит от хоста:

    - 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

У меня была похожая проблема с лог-файлом, который я хотел напечатать на консоль. split("\n") работает нормально, но добавляет видимые \n к каждой строке, чтобы я нашел лучший путь

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

Он перебирает каждую строку из appNameLogFile и ​​побочный эффект выводит эту строку в консоль. Вы можете обновить его до

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

но в моем случае это было не нужно

0
Damian