web-dev-qa-db-ja.com

ansibleを使用して、ローカルファイルが存在する場合はコピーします

私はプロジェクトで働いており、ansibleを使用してサーバーのクラスターを展開します。実装しなければならないタスクの1つは、ローカルファイルがローカルに存在する場合にのみ、ローカルファイルをリモートホストにコピーすることです。今、私はこれを使用してこの問題を解決しようとしています

- hosts: 127.0.0.1 
  connection: local
  tasks:
    - name: copy local filetocopy.Zip to remote if exists
    - Shell: if [[ -f "../filetocopy.Zip" ]]; then /bin/true; else /bin/false; fi;
      register: result    
    - copy: src=../filetocopy.Zip dest=/tmp/filetocopy.Zip
      when: result|success

Buこれは次のメッセージで失敗します:エラー:「アクション」または「local_action」属性がタスク「ローカルfiletocopy.Zipが存在する場合はリモートにコピー」タスクにありません

コマンドタスクでifを作成しようとしました。 local_actionを使用してこのタスクを作成しようとしましたが、動作させることができませんでした。私が見つけたすべてのサンプルは、local_actionへのシェルを考慮していません。コマンドのサンプルのみがあり、コマンド以外のものはありません。 ansibleを使用してこのタスクを実行する方法はありますか?

23
dirceusemighini

最初のステップを次のように変更します

- name: copy local filetocopy.Zip to remote if exists
  local_action: stat path="../filetocopy.Zip"
  register: result    
21
Sandra Parsick

より包括的な答え:

いくつかのタスクを実行する前にlocalファイルの存在を確認したい場合は、次の包括的なスニペットがあります。

- name: get file stat to be able to perform a check in the following task
  local_action: stat path=/path/to/file
  register: file

- name: copy file if it exists
  copy: src=/path/to/file dest=/destination/path
  when: file.stat.exists

何らかのタスクを実行する前にremoteファイルの存在を確認したい場合は、次の方法があります。

- name: get file stat to be able to perform check in the following task
  stat: path=/path/to/file
  register: file

- name: copy file if it exists
  copy: src=/path/to/file dest=/destination/path
  when: file.stat.exists
25
edelans

2つのタスクを設定しない場合は、is_fileを使用してローカルファイルが存在するかどうかを確認できます。

tasks:
- copy: src=/a/b/filetocopy.Zip dest=/tmp/filetocopy.Zip
  when: '/a/b/filetocopy.Zip' | is_file

パスはプレイブックディレクトリからの相対パスなので、ロールディレクトリ内のファイルを参照する場合は、マジック変数role_pathを使用することをお勧めします。

参照: http://docs.ansible.com/ansible/latest/playbooks_tests.html#testing-paths

8
Victor Jerlin

Fileglobは、最終的に存在するファイルの検索を許可します。

- name: copy file if it exists
  copy: src="{{ item }}" dest=/destination/path
  with_fileglob: "/path/to/file"
2