2017-10-16 12 views
0

私は、いくつかのコードを作成し、結果を自分のサーバーにコピーする、Aniableプレイブックを作成しています。このように:可能性:シェルスクリプトによって新しく作成されたファイルを取得するには?

- name: build web packages 
    local_action: 
    script build.sh 
    chdir: {{ item.path }}/build.sh 
    with_items: {{ packages }} 

- name: upload static files 
    synchronize: 
    # This should be a loop 
    src: {{ item.path }}/built_files # How to get output files 
    dest: {{ deploy_dir }}/{{ item.name }} 

ビルドされたファイル以外にも、私はコピーしたくない他のファイルもビルドディレクトリにあります。

異なるパッケージが異なるフォルダに作成される可能性がありますので、ローカルディレクトリと差分ファイルを監視する必要がありますか?どうすればいい?

+0

私はループを書くのに苦労しています...もし私が成功すれば、私はこの質問に自分自身で答えるでしょう。今私は "Include"指示が私の場合にうまく収まることがわかりました。 – zstbsqx

+0

ビルドする前に既存のファイルをコピーしたくない**という重要なコメントを削除しました。あなたの目的は何ですか? – techraf

+0

私はコメントを削除してコメントをクリアすると思った。私はここで似たような質問は見つからなかったので、必要な人とそれを共有したいと思います。誤解を招いて申し訳ありません。 – zstbsqx

答えて

1

これには、概念的な答えは、あなたのためのコードを書くには余りにも複雑である:packagesをループでpath上でローカルに

  1. 使用find module

  2. files_beforeという名前の変数に既存のファイルへのパスのリストを取得するために結果を平坦化します。

  3. あなたの質問に投稿されたようにbuild web packagesタスクを使用してください。

  4. のローカルでモジュールをループ内でループpackages(最初のタスクと同じ)に使用してください。

  5. files_afterという名前の変数に既存のファイルへのパスのリストを取得するために結果を平坦化します。 differencefiles_afterfiles_beforeにわたるループに

  6. 使用copy module(ないsynchronize)。

あなたは別のset_factタスクで、または直接、最後のタスクでwith_items宣言のいずれかで平坦化を実装することができます。

また、path filtersと文字列操作を使用して、パスを相対パスに変換して宛先ディレクトリを指定する必要があります。


さて、ビルドプロセスはまた、サブディレクトリを作成し、あなたが、構造を保持上記のものと同等のタスクを追加しますが、ディレクトリへfind範囲を限定し、ターゲット・マシン上でそれらを作成するためにfile moduleを使用する場合。


上記が複雑に見える場合は、要件とツールを指定したことになります。

さらに、プレイ全体を一度だけ実行することができます(プレイの前にローカルリポジトリを削除して再作成しない限り)。

0

また、タイムスタンプを使用してアイデアを思いついた。

# main.yaml 
- name: build and upload packages 
    include: web.yaml  # Use include_tasks if version >= 2.4 
    with_items: 
    - name: package1 
     path: path1  # build directory 
    - name: package2 
     path: path2 
    ... 
    loop_control: 
    loop_var: package 

# web.yaml 
- name: record begin timestamp 
    local_action: command date +%s 
    register: build_begin_ts 

- name: build packages 
    local_action: 
    module: command bash build.sh  # Use script module if version >= 2.4 
    chdir: "{{ package.path }}" 

- name: record done timestamp 
    local_action: command date +%s 
    register: build_done_ts 

- name: find built files 
    local_action: 
    module: find 
    paths: "{{ package.path }}" 
    file_type: any 
    recurse: yes 
    age: "{{ (build_begin_ts.stdout | int) - (build_done_ts.stdout | int) }}s" 
    register: built_files 

- name: upload built files 
    copy: 
    src: "{{ item.path }}" 
    dest: "{{ target_path }}/{{ item.path | basename }}" 
    with_items: "{{ built_files.files }}" 
関連する問題