Подтвердить что ты не робот

Ansible - сообщение для печати - debug: msg = "line1\n {{var2}}\n строка3 с 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

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

4b9b3361

Ответ 1

В качестве обходного пути я использовал 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

Ответ 2

массив поддержки модуля отладки, так что вы можете сделать так:

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

Выход:

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

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

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

Ответ 3

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

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

Благодаря jhutar.

Ответ 4

Подавление последней пустой строки 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: приводит к хорошим разрывам строк из-за .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..."
]

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

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

- debug: var=result.stdout_lines