私はプロジェクトで働いており、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を使用してこのタスクを実行する方法はありますか?
最初のステップを次のように変更します
- name: copy local filetocopy.Zip to remote if exists
local_action: stat path="../filetocopy.Zip"
register: result
より包括的な答え:
いくつかのタスクを実行する前に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
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
Fileglobは、最終的に存在するファイルの検索を許可します。
- name: copy file if it exists
copy: src="{{ item }}" dest=/destination/path
with_fileglob: "/path/to/file"