ansible-playbookモジュール実行のログ/詳細を取得するにはどうすればよいですか?


95

次のように実行するとします。

$ cat test.sh
#!/bin/bash
echo Hello World
exit 0

$ cat Hello.yml
---

- hosts: MyTestHost
  tasks:
  - name: Hello yourself
    script: test.sh


$ ansible-playbook  Hello.yml

PLAY [MyTestHost] ****************************************************************

GATHERING FACTS ***************************************************************
ok: [MyTestHost]

TASK: [Hello yourself] ********************************************************
ok: [MyTestHost]

PLAY RECAP ********************************************************************
MyTestHost                    : ok=2    changed=0    unreachable=0    failed=0

$

私はそれが成功したことを確かに知っています。

リモートホスト(MyTestHost)上のスクリプトによって "Hello World"エコーが表示/出力される場所はどこですか?またはスクリプトのリターン/終了コード?

私の調査によると、モジュール実行のコールバックなどをインターセプトするプラグインを記述して、ログファイルに書き込むことが可能です。私は時間を無駄にしたくないと思います。

例:以下のstdoutのようなもの(私はansible-playbookではなくansibleを実行していることに注意してください):

$ ansible plabb54 -i /project/plab/svn/plab-maintenance/ansible/plab_hosts.txt -m script -a ./test.sh
plabb54 | success >> {
    "rc": 0,
    "stderr": "",
    "stdout": "Hello World\n"
}

$

回答:


113

-vコマンドラインでフラグをansible-playbookに渡すと、実行された各タスクのstdoutとstderrが表示されます。

$ ansible-playbook -v playbook.yaml

Ansibleには、ロギングのサポートも組み込まれています。次の行をansible構成ファイルに追加します

[defaults] 
log_path=/path/to/logfile

Ansibleは設定ファイルをいくつかの場所で探します:

  • ansible.cfg 実行した現在のディレクトリ ansible-playbook
  • ~/.ansible.cfg
  • /etc/ansible/ansible.cfg

8
ありがとう。ただ貪欲:プレイブックからロギングを動的に開始/停止できますか?同様にset -xしてset +xシェルスクリプトインチ
Kashyap

@thekashyap現時点では可能ではないと思います。
Lorin Hochstein 2013

9
no_log: Trueフラグを使用して、コマンドまたはプレイブックがログに記録されないようにすることができますが、それは私が信じている限り細かい粒度です。
Ade Miller

4
実行ごとに異なるファイルが(ファイルにコマンド/プレイブックが含まれている)存在logrotateするlog_pathようにする方法を教えてくださいansible
発泡スチロールフライ

vstdoutとstderrを取得するために3つのsが必要でした
リッチ

24

Playbookスクリプトタスクはstdout、Playbook以外のコマンドと同じように生成され、を使用して変数に保存する必要がありますregister。これを取得すると、デバッグモジュールはプレイブックの出力ストリームに出力できます。

tasks:
- name: Hello yourself
  script: test.sh
  register: hello

- name: Debug hello
  debug: var=hello

- name: Debug hello.stdout as part of a string
  debug: "msg=The script's stdout was `{{ hello.stdout }}`."

出力は次のようになります。

TASK: [Hello yourself] ******************************************************** 
changed: [MyTestHost]

TASK: [Debug hello] *********************************************************** 
ok: [MyTestHost] => {
    "hello": {
        "changed": true, 
        "invocation": {
            "module_args": "test.sh", 
            "module_name": "script"
        }, 
        "rc": 0, 
        "stderr": "", 
        "stdout": "Hello World\r\n", 
        "stdout_lines": [
            "Hello World"
        ]
    }
}

TASK: [Debug hello.stdout as part of a string] ******************************** 
ok: [MyTestHost] => {
    "msg": "The script's stdout was `Hello World\r\n`."
}

しかし、こんにちはあなた自身のタスクは標準を与えていません
Saurabh Chandra Patel

これは私の好みの方法です。登録された変数の値をデバッグ文で使用することで上手になり、世界はあなたのカキです。
ジョシュアK

14

ログファイルを生成する他の方法もあります。

実行ansible-playbookする前に、次のコマンドを実行してロギングを有効にします。

  • ログファイルの場所を指定します。

    ANSIBLE_LOG_PATH =〜/ ansible.logをエクスポートします

  • デバッグを有効にする

    ANSIBLE_DEBUG = Trueをエクスポート

  • 生成されたログファイルを確認します。

    $ ANSIBLE_LOG_PATH未満


1
ANSIBLE_DEBUGは、ログファイルの指定とは少し異なります。冗長性の選択からも分離されています!これはまだ非常に優れています-debugは、開発者向けのデバッグメッセージを非常に詳細なレベルで提供します。周りに持って良い。
AlanSE 2018

4

公式プラグイン

出力コールバックプラグインを使用できます。たとえば、Ansible 2.4以降では、デバッグ出力コールバックプラグインを使用できます。

# In ansible.cfg:
[defaults]
stdout_callback = debug

(代わりに、export ANSIBLE_STDOUT_CALLBACK=debugプレイブックを実行する前に実行してください)

重要:あなたが実行する必要がありますansible-playbook-v--verbose効果を確認)オプションを指定。stdout_callback = debug設定し、出力は次のようになります。

TASK [Say Hello] ********************************
changed: [192.168.1.2] => {
    "changed": true,
    "rc": 0
}

STDOUT:


Hello!



STDERR:

Shared connection to 192.168.1.2 closed.

debug出力の形式を変えたい場合は、モジュールの他に他のモジュールがあります。ありますjsonyamlunixydenseminimal、など(完全なリスト)。

たとえば、 stdout_callback = yamlと、出力は次のようになります。

TASK [Say Hello] **********************************
changed: [192.168.1.2] => changed=true 
  rc: 0
  stderr: |-
    Shared connection to 192.168.1.2 closed.
  stderr_lines:
  - Shared connection to 192.168.1.2 closed.
  stdout: |2-

    Hello!
  stdout_lines: <omitted>

サードパーティのプラグイン

公式プラグインのどれも満足できない場合は、human_logプラグインを試すことができます。いくつかのバージョンがあります:


3

コールバックプラグインを使用すると、コマンドのstdoutを再生可能な形式で出力できます :gist:human_log.py

出力例を編集します。

 _____________________________________
< TASK: common | install apt packages >
 -------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


changed: [10.76.71.167] => (item=htop,vim-tiny,curl,git,unzip,update-motd,ssh-askpass,gcc,python-dev,libxml2,libxml2-dev,libxslt-dev,python-lxml,python-pip)

stdout:
Reading package lists...
Building dependency tree...
Reading state information...
libxslt1-dev is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 24 not upgraded.


stderr:

start:
2015-03-27 17:12:22.132237

end:
2015-03-27 17:12:22.136859

1

などのAnsibleコマンドラインヘルプはansible-playbook --help、詳細モード(-v)をより詳細(-vvv)または接続デバッグの詳細(-vvvv)に設定することにより、出力の詳細を増やす方法を示します。これにより、stdoutでの詳細の一部が得られ、ログに記録できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.