Distディレクトリの内容をnginxディレクトリにコピーしようとしています。
次を書きます:
- name: copy html file
copy: src=/home/vagrant/dist/ dest=/usr/share/nginx/html/ remote_src=yes directory_mode=yes
しかし、プレイブックを実行するとエラーがスローされます:
TASK [NGINX : copy html file] **************************************************
fatal: [172.16.8.200]: FAILED! => {"changed": false, "failed": true, "msg": "attempted to take checksum of directory:/home/vagrant/dist/"}
ディレクトリのコピーにバグがありますか?別のディレクトリとファイル内にあるディレクトリコンテンツをコピーするにはどうすればよいですか?
助けがありますか?ありがとう
解決済みの回答:ディレクトリのコンテンツを別のディレクトリにコピーするには、次を使用します。
- name: copy consul_ui files
command: cp -r /home/{{ user }}/dist/{{ item }} /usr/share/nginx/html
with_items:
- "index.html"
- "static/"
両方のアイテムを他のディレクトリにコピーします。この例では、アイテムの1つがディレクトリで、もう1つはディレクトリではありません。完璧に機能します。
synchronize モジュールを使用できます。ドキュメントの例:
# Synchronize two directories on one remote Host.
- synchronize:
src: /first/absolute/path
dest: /second/absolute/path
delegate_to: "{{ inventory_hostname }}"
これには、大規模/多数のファイルに対してより効率的であるという追加の利点があります。
Ansible Copy モジュールはデフォルトで制御マシンからリモートマシンにファイル/ディレクトリをコピーします。リモートマシンのファイル/ディレクトリをコピーする場合、およびAnsible 2.0がある場合は、remote_src
をyes
に設定します。
- name: copy html file
copy: src=/home/vagrant/dist/ dest=/usr/share/nginx/html/ remote_src=yes directory_mode=yes
フォルダー自体をコピーせずにフォルダーのcontentsをコピーすることがわかった最も簡単な解決策は、次を使用することです:
- name: Move directory contents
command: cp -r /<source_path>/. /<dest_path>/
これにより、@ surfer19 のフォローアップの質問が解決されます。
内容全体をコピーする場合はどうでしょうか? *が機能しないことに気づいた– surfer190 16年7月23日7:29に
*
はシェルグロブです。これは、cp
を実行するフォルダーbefore内のすべてのファイルを列挙するためにシェルに依存し、.
がcp
に直接指示するという点でディレクトリの内容を取得します( https://askubuntu.com/questions/86822/how-can-i-copy-the-contents-of-a-folder-to-another-folder-in-a- different-directo )
Ansible remote_srcは再帰コピーをサポートしていません。 Ansible copy docsのremote_srcの説明 を参照してください。
フォルダーの内容を再帰的にコピーし、タスクがi等性のままであることを確認するには、通常、次のようにします。
- name: get file names to copy
command: "find /home/vagrant/dist -type f"
register: files_to_copy
- name: copy files
copy:
src: "{{ item }}"
dest: "/usr/share/nginx/html"
owner: nginx
group: nginx
remote_src: True
mode: 0644
with_items:
- "{{ files_to_copy.stdout_lines }}"
欠点は、findコマンドがまだ「変更済み」として表示されることです
私も一日中関与しました!そして最後に、以下のようにcopy:またはcommand:の代わりにShell
コマンドで解決策を見つけました:
- hosts: remote-server-name
gather_facts: no
vars:
src_path: "/path/to/source/"
des_path: "/path/to/dest/"
tasks:
- name: Ansible copy files remote to remote
Shell: 'cp -r {{ src_path }}/. {{ des_path }}'
1. src_pathとdes_pathは/
シンボルで終了2.シェルコマンドではsrc_pathはディレクトリのすべてのコンテンツを表示する.
で終了3. 3.remote-server-nameを使用ホストの両方で:およびプレイブックのremote_src:
指定子の代わりに、jenkinsのShellセクションを実行します。
私はジェンキンスのシェル実行セクションで以下のコマンドを実行するのが良いアドバイスだと思います:
ansible-playbook copy-payment.yml -i remote-server-name
リモートからリモートへの再帰的なコピーの回避策を見つけました:
- name: List files in /usr/share/easy-rsa
find:
path: /usr/share/easy-rsa
recurse: yes
file_type: any
register: find_result
- name: Create the directories
file:
path: "{{ item.path | regex_replace('/usr/share/easy-rsa','/etc/easy-rsa') }}"
state: directory
mode: "{{ item.mode }}"
with_items:
- "{{ find_result.files }}"
when:
- item.isdir
- name: Copy the files
copy:
src: "{{ item.path }}"
dest: "{{ item.path | regex_replace('/usr/share/easy-rsa','/etc/easy-rsa') }}"
remote_src: yes
mode: "{{ item.mode }}"
with_items:
- "{{ find_result.files }}"
when:
- item.isdir == False
以下は私のために働いた、
-name: Upload html app directory to Deployment Host
copy: src=/var/lib/jenkins/workspace/Demoapp/html dest=/var/www/ directory_mode=yes
これにより、Ansibleサーバーからリモートにファイルをコピーするための理想的なソリューションが見つかりました。
yamlファイルのコピー
- hosts: localhost
user: {{ user }}
connection: ssh
become: yes
gather_facts: no
tasks:
- name: Creation of directory on remote server
file:
path: /var/lib/jenkins/.aws
state: directory
mode: 0755
register: result
- debug:
var: result
- name: get file names to copy
command: "find conf/.aws -type f"
register: files_to_copy
- name: copy files
copy:
src: "{{ item }}"
dest: "/var/lib/jenkins/.aws"
owner: {{ user }}
group: {{ group }}
remote_src: True
mode: 0644
with_items:
- "{{ files_to_copy.stdout_lines }}"