web-dev-qa-db-ja.com

Ansible Playbook Shellの出力

Ansible-playbookを使用してps、dstatなどのコマンドを使用して、いくつかのホストをすばやく監視したいと思います。 ansibleコマンド自体は、私が望むものを完全に実行します。たとえば、私は使用します:

ansible -m Shell -a "ps -eo pcpu,user,args | sort -r -k1 | head -n5"

そして、次のようにすべてのホストのすべての標準出力をうまく出力します:

localhost | success | rc=0 >>
0.0 root     /sbin/init
0.0 root     [kthreadd]
0.0 root     [ksoftirqd/0]
0.0 root     [migration/0]

otherhost | success | rc=0 >>
0.0 root     /sbin/init
0.0 root     [kthreadd]
0.0 root     [ksoftirqd/0]
0.0 root     [migration/0] 

ただし、これには、すべてのタスクに対してシェルスクリプトを大量に保持する必要がありますが、これは非常に「わかりにくい」ため、これを脚本に入れます。

---
-
  hosts: all
  gather_facts: no
  tasks:
    - Shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5

-vvで実行しますが、出力には辞書の内容が基本的に表示され、改行はそのように印刷されないため、次のように読みにくくなります。

changed: [localhost] => {"changed": true, "cmd": "ps -eo pcpu,user,args | sort -r -k1 
head -n5 ", "delta": "0:00:00.015337", "end": "2013-12-13 10:57:25.680708", "rc": 0,
"start": "2013-12-13 10:57:25.665371", "stderr": "", "stdout": "47.3 xxx    Xvnc4 :24
-desktop xxx:24 (xxx) -auth /home/xxx/.Xauthority -geometry 1920x1200\n
.... 

register: varと 'debug'タスクを追加して{{ var.stdout }}を表示することも試みましたが、結果はもちろん同じです。

プレイブック経由で実行したときに、コマンドのstdout/stderrから適切にフォーマットされた出力を取得する方法はありますか?私はいくつかの可能な方法を考えることができます(sedを使用して出力をフォーマットしますか?出力をホスト上のファイルにリダイレクトし、そのファイルを取得して画面にエコーしますか?)が、シェル/アンシブルの知識が限られていると試してみるだけの日。

48
stijn

debugモジュールは本当に愛を使うことができますが、現時点でできることはこれを使うことです:

- hosts: all
  gather_facts: no
  tasks:
    - Shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
      register: ps

    - debug: var=ps.stdout_lines

次のような出力が得られます。

ok: [Host1] => {
    "ps.stdout_lines": [
        "%CPU USER     COMMAND",
        " 1.0 root     /usr/bin/python",
        " 0.6 root     sshd: root@notty ",
        " 0.2 root     Java",
        " 0.0 root     sort -r -k1"
    ]
}
ok: [Host2] => {
    "ps.stdout_lines": [
        "%CPU USER     COMMAND",
        " 4.0 root     /usr/bin/python",
        " 0.6 root     sshd: root@notty ",
        " 0.1 root     Java",
        " 0.0 root     sort -r -k1"
    ]
}
65

これは開始かもしれません:

- hosts: all
  gather_facts: no
  tasks:
    - Shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
      register: ps

    - local_action: command echo item
      with_items: ps.stdout_lines

注:ps.stdout_linesに関するドキュメントについては、 ( 'Register Variables'章) で説明しています。

16
leucos

ロイコスが答えで言ったことを拡張して、Ansibleの謙虚な debug モジュールで情報を印刷することもできます:

- hosts: all
  gather_facts: no
  tasks:
    - Shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
      register: ps

    # Print the Shell task's stdout.
    - debug: msg={{ ps.stdout }}

    # Print all contents of the Shell task's output.
    - debug: var=ps
8
geerlingguy

Ansible-playbookでminimalstdout_callbackを使用すると、アドホックansibleを使用した場合と同様の出力が得られました。

Ansible.cfgで(私はOS Xを使用しているので、インストールに合わせてcallback_pluginsパスを変更してください)

stdout_callback     = minimal
callback_plugins    = /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ansible/plugins/callback

あなたのようなansible-playbookタスク

---
-
  hosts: example
  gather_facts: no
  tasks:
    - Shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5

アドホックコマンドのように、このような出力を提供します

example | SUCCESS | rc=0 >>
%CPU USER     COMMAND
 0.2 root     sshd: root@pts/3
 0.1 root     /usr/sbin/CROND -n
 0.0 root     [xfs-reclaim/vda]
 0.0 root     [xfs_mru_cache]

私はansible-playbook 2.2.1.0を使用しています

2
Jason S

特定の終了ステータスが必要な場合、Ansibleはcallback pluginsでそれを行う方法を提供します。

。 100%正確な終了ステータスが必要な場合、これは非常に優れたオプションです。

そうでない場合は、常に Debug Module を使用できます。これはstandardこの使用例の場合。

乾杯

2
Francis

ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook /tmp/foo.yml -vvv

STDOUTを使用したタスクにはセクションがあります:

STDOUT:

What ever was in STDOUT
0
Adam Miller