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
Но это не печатает переменную с новыми строками (для третьего действия отладки)?
Ответы
Ответ 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
=========================
-
Дополнительные примечания относительно модуля паузы:
-
Если у вас несколько хостов, помните, что задача "пауза" будет запускаться только один раз против первого хоста в списке хостов.
Это означает, что если переменная, которую вы хотите отобразить, существует только в части хостов, а первый хост не содержит эту переменную, то вы получите ошибку.
Чтобы избежать такой проблемы, используйте {{hostvars ['my_host'] ['my_var']}} вместо {{my_var}}
-
Сочетание "пауза" с "когда" условно может пропустить задачу! Почему? Потому что задача будет выполняться только один раз против первого хоста, который может не соответствовать указанным условиям "когда".
Чтобы избежать этого, не используйте условия, которые ограничивают количество хостов! поскольку вам это тоже не нужно, потому что вы знаете, что задача все равно будет запускаться только один раз, также используйте указанные выше 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