Ansible - 打印消息 - 调试:msg="line1 \n {{ var2 }} \n line3 with var3 = {{ var3 }}"
Ansible - Print message - debug: msg="line1 \n {{ var2 }} \n line3 with var3 = {{ var3 }}"
在 Ansible (1.9.4) 或 2.0.0 中
我运行以下动作:
- debug: msg="line1 \n {{ var2 }} \n line3 with var3 = {{ var3 }}"
$猫roles/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
但这不是用新行打印变量(针对第三次调试操作)?
这是discussed here。简而言之,您要么需要通过 sed 传输输出以将 \n
转换为实际的换行符,要么您需要编写一个回调插件来为您执行此操作。
作为一种变通方法,我使用了 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
我深入了解了@Bruce P 关于通过 sed 管道输出的回答,这就是我想到的:
ansible-playbook [blablabla] | sed 's/\n/\n/g'
如果有人感兴趣。
我发现使用调试打印多行文本的最方便的方法是:
- 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。
调试模块支持数组,所以你可以这样做:
debug:
msg:
- "First line"
- "Second line"
输出:
ok: [node1] => {
"msg": [
"First line",
"Second line"
]
}
或者您可以使用此答案中的方法:
In YAML, how do I break a string over multiple lines?
用 [:-1]
抑制 apt
的最后一个空字符串
---
- name: 'apt: update & upgrade'
apt:
update_cache: yes
cache_valid_time: 3600
upgrade: safe
register: apt
- debug: msg={{ apt.stdout.split('\n')[:-1] }}
由于 .split('\n')
,上面的 debug:
行产生了漂亮的换行符,并且由于 [:-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..."
]
暂停模块:
我发现显示带有格式(例如:换行、制表符...)的消息的最方便、最简单的方法是使用 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
=========================
关于暂停模块的额外说明:
如果您有多个主机,请注意 pause
任务将 运行
仅针对主机列表中的第一台主机进行一次。
这意味着如果你想显示的变量只存在于
部分主机和第一个主机不包含该变量
那么你会得到一个错误。
为避免此类问题,请使用 {{ hostvars['my_host']['my_var'] }}
而不是 {{ my_var }}
结合 pause
和 when
条件可能会跳过任务!为什么?
因为任务只会运行一次针对第一个主机
可能不符合规定的 when
条件。
为避免这种情况,请不要使用限制数量的条件
主机!因为你也不需要它,因为你知道任务会
运行 反正只有一次。也使用上面提到的 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 %}
您可以使用 stdout_lines
的寄存器变量:
- name: Do something
shell: "ps aux"
register: result
- debug: var=result.stdout_lines
我想打印到控制台的日志文件也有类似的问题。 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 }}"
但在我的情况下不需要
在 Ansible (1.9.4) 或 2.0.0 中
我运行以下动作:
- debug: msg="line1 \n {{ var2 }} \n line3 with var3 = {{ var3 }}"
$猫roles/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
但这不是用新行打印变量(针对第三次调试操作)?
这是discussed here。简而言之,您要么需要通过 sed 传输输出以将 \n
转换为实际的换行符,要么您需要编写一个回调插件来为您执行此操作。
作为一种变通方法,我使用了 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
我深入了解了@Bruce P 关于通过 sed 管道输出的回答,这就是我想到的:
ansible-playbook [blablabla] | sed 's/\n/\n/g'
如果有人感兴趣。
我发现使用调试打印多行文本的最方便的方法是:
- 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。
调试模块支持数组,所以你可以这样做:
debug:
msg:
- "First line"
- "Second line"
输出:
ok: [node1] => {
"msg": [
"First line",
"Second line"
]
}
或者您可以使用此答案中的方法:
In YAML, how do I break a string over multiple lines?
用 [:-1]
抑制 apt
的最后一个空字符串
---
- name: 'apt: update & upgrade'
apt:
update_cache: yes
cache_valid_time: 3600
upgrade: safe
register: apt
- debug: msg={{ apt.stdout.split('\n')[:-1] }}
由于 .split('\n')
,上面的 debug:
行产生了漂亮的换行符,并且由于 [:-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..."
]
暂停模块:
我发现显示带有格式(例如:换行、制表符...)的消息的最方便、最简单的方法是使用 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
=========================
关于暂停模块的额外说明:
如果您有多个主机,请注意
pause
任务将 运行 仅针对主机列表中的第一台主机进行一次。这意味着如果你想显示的变量只存在于 部分主机和第一个主机不包含该变量 那么你会得到一个错误。
为避免此类问题,请使用
{{ hostvars['my_host']['my_var'] }}
而不是{{ my_var }}
结合
pause
和when
条件可能会跳过任务!为什么? 因为任务只会运行一次针对第一个主机 可能不符合规定的when
条件。为避免这种情况,请不要使用限制数量的条件 主机!因为你也不需要它,因为你知道任务会 运行 反正只有一次。也使用上面提到的
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 %}
您可以使用 stdout_lines
的寄存器变量:
- name: Do something
shell: "ps aux"
register: result
- debug: var=result.stdout_lines
我想打印到控制台的日志文件也有类似的问题。 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 }}"
但在我的情况下不需要