Python 如何从shell命令';s标准输出通过ansible运行

Python 如何从shell命令';s标准输出通过ansible运行,python,jinja2,ansible,ansible-playbook,Python,Jinja2,Ansible,Ansible Playbook,所以我有一个场景,我在一台机器上使用ansible执行一个shell命令,以获取一些关于标准输出的信息。我正在使用register将其结果记录在变量my_info中,并使用debug打印my_info,我看到它的结果后附加了\n(Ansible已经附加了\n。linux上的相同命令不附加\n”)。当我在模板中使用配置中的my_info时,它会在配置中打印一行新行,因此会弄乱我的配置 下面是代码和输出的运行方式 Ansible代码: - name: calculate range address

所以我有一个场景,我在一台机器上使用ansible执行一个shell命令,以获取一些关于标准输出的信息。我正在使用
register
将其结果记录在变量
my_info
中,并使用
debug
打印
my_info
,我看到它的结果后附加了
\n
(Ansible已经附加了\n。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"
}

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

您可以使用

grep 'CONFIG_PARAMS' /path/to/the/file | head -n 1 | tr -d '\n'
如果在命令行上运行此命令,您将看到如下内容

me@machine:~ > echo cat | tr -d '\n'
catme@machine:~ >
因为linux正在添加换行符。

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

执行一个低级且脏的SSH命令,而不是通过模块子系统。这很有用,只应在两种情况下执行。第一种情况是在较旧的(python 2.4及之前)上安装
python simplejson
因为几乎所有的核心模块都需要它,所以主机需要它作为运行模块的依赖项。另一个是与任何设备(如未安装任何Python的路由器)进行对话。在任何其他情况下,使用
shell
命令
模块更合适。提供给raw的参数直接通过配置运行用遥控器发射炮弹

因此,我使用
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"
}

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

您可以使用的内置过滤器来实现这一点。具体而言,请使用
微调,例如:

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

谢谢:)。这对我有效。我曾尝试用sed命令替换新行,但对我无效。不确定为什么不行。但这样做了。谢谢这是一个更好的方法。除了针对未安装Python的系统之外,我还没有找到使用
raw
的好理由,并且该用例应该是使用
raw
设置Python。@您说得对。
raw
命令只有在文档中定义的用例需要时才能使用。我已将其更改为
shell
。非常感谢。