2016-08-09 5 views
0

シェルパイプラインを実行するAnipalスクリプトを作成しようとしていて、そのパイプラインの出力に基づいてプレイブックの実行を終了するかどうかを決定しています。ここで可能性のあるシェルコマンドの出力を確認する

- name: Check if the number of HITACHI devices is equal to 1 
    shell: lsscsi | grep HITACHI | awk '{print $6}' | wc -l 
    register: numOfDevices 
    when: numOfDevices|int == 1 

エラーされています:

{ 
    "failed":true, 
    "msg":"The conditional check 'numOfDevices|int == 1' failed. 
The error was: error while evaluating conditional (numOfDevices|int == 1): 'numOfDevices' is undefined\n\nThe error appears to have been in '/etc/ansible/config/test.yml': line 14, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: Check if the number of HITACHI devices is equal to 1\n ^here\n" 
} 

ことができる人は問題になる可能性がものを私に伝えます

ここで、問題のコードはありますか?

+1

'grep | awk | wc'?あなたはawkが3つのコマンドのすべての仕事をすることができると思いますか? –

+0

ところで、あなたの実際の目標は何ですか?正確にHitachiデバイスが1つでもない場合、プレイブックの実行を停止しますか?正確に1台のHitachiデバイスが存在する(またはそうでない)場合、他のコマンドを実行しますか?他に何か? 'when'節は、どこにあるのか分からない。問題はそれがどこにあるべきかということです。 –

+0

正確に1台のHitachiデバイスがない場合は、プレイブックを停止したいと考えています。 – Omri

答えて

2

は、あなたのシェルコマンドの比較をやって考えてみましょう:

- name: Check if the number of HITACHI devices is equal to 1 
    shell: test "$(lsscsi | awk '/HITACHI/ { count++ } END { print count }')" -eq 1 

コマンドの終了ステータスがゼロでないときのデフォルトfailedWhenがあるので、あなたは、ここですべてのregisterを使用する必要はありません。


あなたはしかし、registerを使用したいなかった場合:

- name: Check if the number of HITACHI devices is equal to 1 
    shell: lsscsi | awk '/HITACHI/ { count++ } END { print count }' 
    register: countHitachiDevices 
    failed_when: int(countHitachiDevices.stdout) != 1 

ノート代わりにwhenfailed_whenの使用:when句をコマンドはまったく実行されようとしている場合には、決定failed_when句は、そのコマンドが失敗したと判断されたかどうかを判断します。

+0

'-eq 1'は何のために説明できますか? – Omri

+0

'シェル内の' ['は' test'とも呼ばれるコマンドです。 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.htmlすべての実装で保証されているPOSIXベースライン機能を文書化しています。 '-eq'は数値の比較です。 –

+0

ありがとう!最初の解決策は素晴らしいものでした。私は秒のソリューションを実行しようとすると、私は得る: '致命的:FAILED!条件式(int(countHitachiDevices.stdout)!= 1)を評価中にエラーが発生しました:=> {"failed":true、 "msg" 'int'は未定義です "}'。なぜなのかご存知ですか? – Omri

関連する問題