103

以下を実行するとします。

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

$
4

6 に答える 6

24

プレイブック スクリプト タスクはstdout、プレイブック以外のコマンドと同じように生成されます。必要なのは、 を使用して変数に保存することだけ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`."
}
于 2014-08-29T02:34:04.270 に答える
20

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

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

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

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

  • デバッグを有効にする

    export ANSIBLE_DEBUG=True

  • その生成されたログ ファイルを確認するには。

    $ANSIBLE_LOG_PATH 以下

于 2018-03-29T13:09:46.907 に答える
6

公式プラグイン

出力コールバック プラグインを使用できます。たとえば、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出力を別の形式にしたい場合は、モジュール以外に他のモジュールがあります。、、、、、などがありjsonますyaml(unixy完全denseminimalリスト)

たとえば、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プラグインを試すことができます。いくつかのバージョンがあります:

于 2019-01-29T08:12:42.290 に答える
3

コールバック プラグインを使用すると、play : 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
于 2015-03-27T17:13:34.433 に答える