web-dev-qa-db-ja.com

Ansible:ディレクトリのコンテンツを別のディレクトリにコピーします

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/"}

ディレクトリのコピーにバグがありますか?別のディレクトリとファイル内にあるディレクトリコンテンツをコピーするにはどうすればよいですか?

助けがありますか?ありがとう

35
Asier Gomez

解決済みの回答:ディレクトリのコンテンツを別のディレクトリにコピーするには、次を使用します。

- name: copy consul_ui files
  command: cp -r /home/{{ user }}/dist/{{ item }} /usr/share/nginx/html
  with_items:
   - "index.html"
   - "static/"

両方のアイテムを他のディレクトリにコピーします。この例では、アイテムの1つがディレクトリで、もう1つはディレクトリではありません。完璧に機能します。

25
Asier Gomez

synchronize モジュールを使用できます。ドキュメントの例:

# Synchronize two directories on one remote Host.
- synchronize:
    src: /first/absolute/path
    dest: /second/absolute/path
  delegate_to: "{{ inventory_hostname }}"

これには、大規模/多数のファイルに対してより効率的であるという追加の利点があります。

34
Aidan Feldman

Ansible Copy モジュールはデフォルトで制御マシンからリモートマシンにファイル/ディレクトリをコピーします。リモートマシンのファイル/ディレクトリをコピーする場合、およびAnsible 2.0がある場合は、remote_srcyesに設定します。

- name: copy html file
  copy: src=/home/vagrant/dist/ dest=/usr/share/nginx/html/ remote_src=yes directory_mode=yes
14
helloV

フォルダー自体をコピーせずにフォルダーの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

7
fractalic

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コマンドがまだ「変更済み」として表示されることです

3
dvanrensburg

私も一日中関与しました!そして最後に、以下のように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
2
foad322

リモートからリモートへの再帰的なコピーの回避策を見つけました:

- 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
1
agrimal

以下は私のために働いた、

-name: Upload html app directory to Deployment Host
 copy: src=/var/lib/jenkins/workspace/Demoapp/html dest=/var/www/ directory_mode=yes
0
Sakharam Thorat

これにより、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 }}"
0
Prateek patel