Python 如何从shell命令';s标准输出通过ansible运行
所以我有一个场景,我在一台机器上使用ansible执行一个shell命令,以获取一些关于标准输出的信息。我正在使用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
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
。非常感谢。