2015-11-23 197 views
1

所以我有一個場景,我在一臺機器上執行一個shell命令,使用ansible獲得標準輸出的一些信息。我正在使用register將其結果記錄在一個變量my_info中,並使用debug打印my_info,我看到其結果附有\n(Ansible附加了\ n。在Linux上的相同命令不附加\ n「)。當我使用在模板中my_info的配置它打印新線的配置,因此搞亂了我的配置如何從shell命令的標準輸出運行中刪除換行符

下面是代碼和輸出如何去

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" 
} 

我們怎樣從這個輸出中剝離空間,或者可能在模板中進行更改以避免打印新行。

回答

4

raw_module的文件,它要求只有在特定情況下使用它:

執行低降濁SSH命令,通過模塊子系統不會。這很有用,只能在兩種情況下完成。第一種情況是在較老的(Python 2.4和之前的版本)主機上安裝python-simplejson,因爲幾乎所有的核心模塊都需要它,因此需要它作爲運行模塊的依賴。另一種是對任何沒有安裝任何Python的設備(如路由器)進行講話。在其他情況下,使用shellcommand模塊更合適。給raw的參數直接通過配置的遠程shell運行。

所以,我測試了raw簡單回波呼叫和shell模塊:

- 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" 
} 

而且,您可以在輸出中看到差異。

+0

這是一個更好的方法。除了沒有安裝Python的系統之外,我還沒有看到有一個很好的理由可以使用'raw',並且這個用例應該是使用'raw'來設置Python。 – ydaetskcoR

+0

@AKS你是對的。只有按照文檔中定義的用例才需要使用'raw'命令。我已將它更改爲'shell'。非常感謝 。 –

+0

@ydaetskcoR同意。將命令更改爲shell –

2

如果您在命令行運行這個,你會看到類似

[email protected]:~ > echo cat | tr -d '\n' 
[email protected]:~ > 

由於Linux 添加換行符您可以刪除從標準輸出換行符,使用

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

+0

謝謝:)。這對我有效。我正在嘗試sed命令來替換新行,但這並不適合我。不知道爲什麼不。但是這樣做了。謝謝 –

0

您可以使用Jinja2的內置過濾器來實現此目的。具體而言,使用trim,例如,:

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

謝謝,會試試看。 –

相關問題