2016-12-28 24 views
0

ansible/ansible・脚本のバージョンを使用する方法、見つからない:私は使用してパッケージをインストールしようとしている2.1.2.0/2.2.0.0Ansibleレジスタ結果result.stdout result.rcなどdictの変数は、ループまで

yum/aptがありますが、パッケージをインストールするためのリポジトリがpackagecloud.ioに入っているため、エラーメッセージが表示されることがあります(私の不安プレイブックを実行しているときに-vvvを渡しています)。

[Errno 14] curl#56 - \"TCP connection reset by peer\"\nTrying other mirror. ...some ansible verbose text here.. [Errno 256] No more mirrors to try. 

これは常に発生するわけではありません。同じプレイブックをもう一度やり直すと正常に動作し、障害(接続リセット)がランダムに発生します。

この問題を解決するために、register変数で使用するAnecessのuntilループを使用したかったのです。

untilループhereを使用する方法についてはAnsibleのドキュメントを参照して作成しましたが、その構文を使用して、結果変数(登録済み)dictにキーがないという「辞書」エラーが表示されますstdoutという名前です。それから私はresult.rc(キーフィールド)を使用しようとしましたが、それはCentOSのマシン上で働いていたが、次のresult.rc dictの存在しないエラーでのUbuntu 14.xの信頼浮浪者のマシンに失敗しました:

- name: Install telegraf agent/collector (RedHat) 
    yum: 
    name: "{{ agent_collector }}" 
    state: "installed" 
    when: (ansible_os_family == 'RedHat' and company_install_collector == true) 
    register: result 
    until: result.stdout.find("Installed:") != -1 
    #The following works in CentOS/RedHat 
    #until: result.rc == 0 

- debug: msg="result (redhat) = {{ result }}" 

OR(アップデート明らかだった私の質問)

- name: Install Company Proxy (Ubuntu) 
    apt: 
    name: "{{ company_proxy_pkg }}" 
    state: "installed" 
    when: (ansible_distribution == 'Ubuntu' and company_install_proxy == true) 
    register: result 
    until: result.rc == 0 

- debug: msg="result (ubuntu) = {{ result }}" 

に次のエラーメッセージ(result.stdoutを取得する - のdictオブジェクトは、標準出力「は属性がありません 『』のRedHat/CentOSのとUbuntuの両方ではなく、辞書オブジェクトを取得しても属性がありません」RCを'Ubuntuサーバーのみ):

fatal: [localhost]: FAILED! => {"failed": true, "msg": "The conditional check '(result.stdout.find(\"Installed:\") != -1)' failed. The error was: error while evaluating conditional ((result.stdout.find(\"Installed:\") != -1)): 'dict object' has no attribute 'stdout'"} 

fatal: [localhost]: FAILED! => { 
    "failed": true, 
    "msg": "The conditional check 'result.rc == 0' failed. The error was: error while evaluating conditional (result.rc == 0): 'dict object' has no attribute 'rc'" 
} 

ドキュメントは、私が上-vvv冗長出力でそれらを見ることができれば、それらが存在しないか、と言うとき、レジスタ変数(結果、私の場合は)がstdoutまたはrc辞書/変数を持っていないのはなぜ1つのOSですが、他のOSには表示されませんか?

+0

ありがとうございますが、私の質問は有効です。お返事をありがとうございます。 –

+0

私は問題を見つけたと思う。結果変数の内容を絞り込むために 'ignore_errors:yes'を使い、次の' debug'文で結果変数の出力をすべて得ました。問題はこれです。 Ubuntuでは、result.rcはありませんが、result.stdoutがありますので、result.stdout.find( "...検索するテキスト")== 0またはいつかのように 'until'を使用できます。 RedHatでは少なくとも私が使用しているバージョンのものでは結果はありません.stdoutなので、上記の文を使うことはできませんので、until:result.rc == 0'を使う必要があります。それは答えですが、私はこれを証明するためにさらにテストが必要です。 –

+0

Ubuntuのresult.stdoutは、アクションが成功した場合にのみ設定され、失敗したアクションに対しては結果に.stdout dictが設定されていないので、別のものを探す必要があります。 CentOSでは、Imは正常になったときにstdoutとrcを設定しますが、何らかの理由でそのアクションが失敗した場合には 'rc' dictしかステータス1でセットされません。 –

答えて

1

正解との調査結果:CentOSの

  1. 、アクションが成功し、登録した変数の結果が設定されている場合、ユーザーは元のためにこれらのdict変数を見ることができれば:結果。 rcが0、result.stdout = "something \ nsomethingEsle \ netc etc"、および/またはresult.stdout_lines = "... same as above ..."と結果が返されることがあります。アクションが失敗した場合、結果は表示されませんでした。connection resetなどの理由で、失敗した場合は、yumモジュールを使用して私のケースに設定されました。その場合、失敗したアクションに使用可能なdict変数はresult.rc!= 0でした。したがって、untilループでは、until: result.rc == 0の条件がCentOSの成功/失敗の両方のケースで機能しました。 Ubuntuの

  2. aptモジュールのアクションが成功した場合、私はresult.stdout持って、設定された変数が、無result.rcのdictの変数セットをresult.stdout_lines。失敗した操作の場合、結果はありません.stdoutまたはresult.stdout_linesまたはresult。rc dict変数が設定されます。そう、Ubuntuの場合、私はuntilループをこれらの辞書変数の1つを使って使うことができませんでした。私は、スクリプト内のapt-get install <pacakge>をラップし、AnsibleがやっているやってBASHなどのループまで使用する、のだと思うことができ

唯一の回避策。少なくともコード化は簡単ではなく、終了コードが0でない場合はuntilを使用できます。

しかし、私は最終的に成功した両方のためのUbuntuで動作するソリューションを、発見し、ケースを失敗:私が失敗した条件のために登録した変数resultを使用する必要がある場合

Jinja2のフィルタは、したがって、すなわちwhen: result|failedを助けるかもしれません

until: result|succeeded 

良いことは、上記の文までのCentOSとUbuntuの両方のために、両方の大成功のために働くだろう、ということです:として、その後、untilを使用して、私はすなわち、それ(失敗した状態の反対を)使用しますsful/failed状態。

関連する問題