所以我有一个场景,我在机器上使用ansible执行shell命令以获取有关标准输出的一些信息。我正在使用register
将其结果记录在变量my_info
中并使用my_info
打印debug
,我看到它的结果附加了\n
(Ansible附加了\ n .Same命令在linux上不附加\ n“)。当我使用时在配置模板中的my_info
它在配置中打印一个新行,因此弄乱了我的配置。
这是代码和输出的方式。
Ansible代码:
- name: calculate range address start
raw: grep 'CONFIG_PARAMS' /path/to/the/file | head -n 1
register: my_info
输出:
ok: [My_HOST] => {
"msg": "CONFIG_PARAMS\n"
}
我们如何从该输出中剥离空间或者可能在模板中进行更改,以便不打印新行。
在raw_module的文档中,它要求仅在特定情况下使用它:
执行低位且脏的SSH命令,而不是通过模块子系统。这很有用,只能在两种情况下完成。第一种情况是在较旧的(Python 2.4及之前)主机上安装
python-simplejson
,这些主机需要它作为运行模块的依赖项,因为几乎所有核心模块都需要它。另一个是与没有安装任何Python的路由器等任何设备对话。在任何其他情况下,使用shell
或command
模块更合适。给raw的参数直接通过配置的远程shell运行。
所以,我用raw
和shell
模块测试了简单的echo调用:
- name: System setup
hosts: 127.0.0.1
connection: local
tasks:
- name: simple print hello
raw: echo 'hello'
register: my_info
- debug:
msg: '{{ my_info.stdout }}'
它输出一个新行:
TASK: [debug ] ****************************************************************
ok: [127.0.0.1] => {
"msg": "hello\n"
}
并使用shell
模块:
- name: System setup
hosts: 127.0.0.1
connection: local
tasks:
- name: simple print hello
action: shell echo 'hello'
register: my_info
- debug:
msg: '{{ my_info.stdout }}'
这导致:
TASK: [debug ] ****************************************************************
ok: [127.0.0.1] => {
"msg": "hello"
}
而且,您可以看到输出的差异。
您可以使用Jinja2的内置过滤器来实现此目的。具体来说,使用trim
,例如:
- debug: msg='{{ my_info.stdout | trim}}'
您可以使用从stdout中删除换行符
grep 'CONFIG_PARAMS' /path/to/the/file | head -n 1 | tr -d '\n'
如果你在命令行上运行它,你会看到类似的东西
me@machine:~ > echo cat | tr -d '\n'
catme@machine:~ >
因为linux正在添加换行符。