2017-01-08 3 views
4

Linuxシェルの出力を変数に挿入しようとしていますが、何らかの理由で変数が常に空です。ここで 可能:シェルスクリプトの出力は常に空です

はAnsibleコードです:

- name: Check PHP version 
    shell: php -v 2> /dev/null | awk '{print $2; exit}' 
    register: php_version 

    - debug: var=php_version 

そして、ここで出力されます:

php -v 2> /dev/null | awk '{print $2; exit}' 
7.0.14 
:私は、サーバー上で直接コマンドを実行すると

ok: [10.0.0.5] => { 
    "php_version": { 
     "changed": true, 
     "cmd": "php -v 2> /dev/null | awk '{print $2; exit}'", 
     "delta": "0:00:00.015180", 
     "end": "2017-01-08 18:41:00.323773", 
     "rc": 0, 
     "start": "2017-01-08 18:41:00.308593", 
     "stderr": "", 
     "stdout": "", 
     "stdout_lines": [], 
     "warnings": [] 
    } 
} 

が、私は有効な結果を得ます

何が問題なのですか?考えられる理由としては

+1

この問題は再現できません。私はあなたの演劇をコピーし、MacOSで2.0.1.0とubuntuで2.3.0の両方を実行しました。私は両方で正確にstdoutを取得します。 –

+0

私も再現できません。サーバー上で直接コマンドを実行する場合、Anipalが使用するのと同じユーザーとシェル '/ bin/sh'を使用していますか? – Zlemini

+0

番号指定されたサーバーとは別のユーザーで実行できます。 – Omri

答えて

3

、なぜあなたは*あなたは、非対話型SSHセッションを通じてシェルを実行したときに最も可能性の高いphp実行可能ファイルへのパスがPATH変数で定義されていない、Ansible CLIからコマンドを実行することはできませんが、(Ansibleと同じ)

shellモジュールの引数には、phpの代わりにフルパスを使用してください。


何の問題だろうか?

あなたがシェル呼び出しでパイプラインを使用していると、リターンコードは、最後のコマンド(awk)のようになりますし、最初の1に障害が発生したものの、あなたは通知されません。

Awkは処理する入力がなく、正常に終了し、stderrを/dev/nullにリダイレクトするため、phpコマンドでエラーは表示されません。例えば

あなたが明示的に存在しないコマンドを実行した場合:

- name: Check PHP version 
    shell: qwerty -v 2> /dev/null | awk '{print $2; exit}' 
    register: php_version 

- debug: var=php_version 

をあなたも取得します:*

"rc": 0, 
"start": "2017-01-09 06:35:10.588258", 
"stderr": "", 
"stdout": "", 
"stdout_lines": [], 
"warnings": [] 

をUnix.SE.にDifference between Login Shell and Non-Login Shell?質問を参照してください

関連する問題