如何通过ansible从shell命令的标准输出中删除换行符

问题描述 投票:4回答:3

所以我有一个场景,我在机器上使用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"
}

我们如何从该输出中剥离空间或者可能在模板中进行更改,以便不打印新行。

python jinja2 ansible ansible-playbook
3个回答
5
投票

raw_module的文档中,它要求仅在特定情况下使用它:

执行低位且脏的SSH命令,而不是通过模块子系统。这很有用,只能在两种情况下完成。第一种情况是在较旧的(Python 2.4及之前)主机上安装python-simplejson,这些主机需要它作为运行模块的依赖项,因为几乎所有核心​​模块都需要它。另一个是与没有安装任何Python的路由器等任何设备对话。在任何其他情况下,使用shellcommand模块更合适。给raw的参数直接通过配置的远程shell运行。

所以,我用rawshell模块测试了简单的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"
}

而且,您可以看到输出的差异。


6
投票

您可以使用Jinja2的内置过滤器来实现此目的。具体来说,使用trim,例如:

- debug: msg='{{ my_info.stdout | trim}}'

2
投票

您可以使用从stdout中删除换行符

grep 'CONFIG_PARAMS' /path/to/the/file | head -n 1 | tr -d '\n'

如果你在命令行上运行它,你会看到类似的东西

me@machine:~ > echo cat | tr -d '\n'
catme@machine:~ >

因为linux正在添加换行符。

© www.soinside.com 2019 - 2024. All rights reserved.