2016-07-07 3 views
3

長時間実行されているシェルコマンドが特定のホストで正常に実行された後、そのホスト上で実行される後続のプレイブックでは実行されないようにしたいと考えています。Ansibleシェルコマンドがホストごとに1回だけ実行されるようにするにはどうすればよいですか?

私は、createsのAnabilitiesシェルタスク(http://docs.ansible.com/ansible/shell_module.htmlを参照)のオプションを知ってうれしかったです。私はシェルコマンドが成功した後、ファイルを作成し、将来の実行で実行コマンドそのことはできません、これを使用して:あなたが見ることができるように

- name: Install Jupiter theme 
    shell: wp theme install ~/downloads/jupiter-theme.zip --activate 
     && touch ~/ansible-flags/install-jupiter-theme 
    args: 
    creates: ~/ansible-flags/install-jupiter-theme 

、私は私のアクティブのホームディレクトリにこれらの制御ファイルのディレクトリansible-flagsを持っていますユーザ(deploy)。

しかし、これは非常にクルージングです。これを行うより良い方法はありますか?

また、別のユーザーとしてステップを実行する必要がある場合は、状況がかなり複雑になります。その場合、私はdeployホームディレクトリとそのサブディレクトリにアクセスすることはできません。私はもちろんアクセス権を与えることができますが、それはさらに複雑さを増しています。私はこれにどう対処することをお勧めしますか?

答えて

2

潜在的なものはステートレスなので、どのようなテクニックを使っても自分で実装する必要があります。今までに一度しかタスクを実行しないようにするのは簡単です。

私はあなたがすでにかなり前進していると思います。たぶん別のパスを使って確認してください。私は確かにwp theme installがそのジップを実際にいくつかの場所に抽出して、createsオプションと共に使用できると確信しています。

  • テーマをチェックし、好きな言語でスクリプトを作成し、それがインストールされていない場合は、それをインストール:

    は選択肢が、それは容易になります何があります。シェルタスクの代わりに、script moduleでスクリプトを実行します。

  • local fact/etc/ansible/facts.dにインストールすると、テーマが既にインストールされているかどうかが確認されます。次に、その事実に基づく条件をshellタスクに適用するだけです。

  • fact cachingを設定し、シェルタスクの結果を登録してファクトとして保存します。ファクトキャッシングを有効にすると、後でプレイブックを実行して保存された結果にアクセスできます。

これはもっと複雑になります。 createsオプションは、このシナリオには最適です。wpコマンドでジップを抽出した場所を使用すると、きれいです。

もちろん、別のユーザーアカウントからアクセスする必要がある場合は、そのファイルへのアクセスを許可する必要があります。所有者が読み取り可能に設定されている権限を持つユーザのホームディレクトリに物を格納するのは理想的な解決策ではありません。

+0

私は例を提供何らかの理由で私はテーマがファイルシステムではなくデータベースにインストールされると思っていました。だから私は人工制御ファイルを作ったのですが、あなたが正しいです、私はテーマのインストール中に作成されたテーマディレクトリを探すことができます。 (たとえそれがDBに格納されていたとしても、その情報についてDBを照会する方法を見つけようとしていたはずです) –

+0

私の質問に答える時間をとっていただきありがとうございます。私は今、「創造」を使うことができない場合には、私が望むことを行うための簡単な方法がないことを今見ています。 –

3

あなたのプレイブックは冪等でなければなりません!
いずれのタスクも複数回実行するのが安全である必要があります(たとえばecho ok)。実行する必要があるかどうかを確認する必要があります。
あなたの仕事は次のようになります。

- name: Install Jupiter theme 
    shell: wp theme is-installed jupiter || wp theme install ~/downloads/jupiter-theme.zip --activate 

それは木星のテーマがインストールされているかどうかを確認し、テーマがインストールされていない場合にのみwp theme installを実行します。
しかし、これはどんな場合でもタスクの結果をchangedとマークします。
は、あなたがこれを行うことができ、それがいいようにするには:

- name: Install Jupiter theme 
    shell: wp theme is-installed jupiter && echo ThemeAlreadyInstalled || wp theme install ~/downloads/jupiter-theme.zip --activate 
    register: cmd_result 
    changed_when: cmd_result.stdout != "ThemeAlreadyInstalled" 

まず、木星のテーマがすでにインストールされている場合、それはチェックします。
この場合、ThemeAlreadyInstalledを出力して終了します。
それ以外の場合はwp theme installとなります。
タスクの結果はcmd_resultに登録されます。
ユーザchanged_whenパラメータは、ThemeAlreadyInstalledアシスタントがタスクを変更されたものとみなしてはならない場合、プレイブックの出力に緑色のままで残っているという事実を述べるパラメータです。

あなたがwp theme install前に、いくつかの準備作業を行う場合(例えばテーマをダウンロードする)、あなたは結果を登録し、後続のタスクでwhen句を使用する別のタスクとしてテストを実行することもできます。

- name: Check Jupiter theme is installed 
    shell: wp theme is-installed jupiter && echo Present || echo Absent 
    register: wp_theme 
    changed_when: false 

- name: Download theme 
    get_url: url=... 
    when: wp_theme.stdout == "Absent" 

- name: Install Jupiter theme 
    shell: wp theme install ~/downloads/jupiter-theme.zip --activate 
    when: wp_theme.stdout == "Absent" 
+0

私は偶数である必要性を理解していますが、この質問はそれとは関係ありません - ステップを繰り返すことは不必要にステップを繰り返さない*と同じ結果を生み出すと仮定すると、どちらの方法でも、ではない? ここでの質問は、時間を節約するために不要なタスクの実行を防ぐ方法です。 –

+0

あなたの提案を使用して、タスクが実際に実行されたかどうかを正確に報告しました。クールなもの、ありがとう! –

+0

@KeithBennett、実行を防ぐためにテストが必要です。私はあなたが実際にホストごとに1回コマンドを実行するのではなく、プレイブックが実行されるたびにテーマがインストールされていることを確認したいと思います。フラグファイルがあるとしますが、誰かがテーマを手動で削除したとします。この場合、テーマがインストールされている場合はtrue、そうでない場合はfalseが必要です。インストールする前に 'wp'コマンドで確認してみてください。 –

関連する問題